কৌণিকতে বস্তুর জন্য নির্বাচিত উপাদানকে বাঁধাই করা


409

আমি বস্তুর তালিকায় একটি নির্বাচিত উপাদানকে বাঁধতে চাই - যা যথেষ্ট সহজ:

@Component({
   selector: 'myApp',
   template: `<h1>My Application</h1>
              <select [(ngModel)]="selectedValue">
                 <option *ngFor="#c of countries" value="c.id">{{c.name}}</option>
              </select>`
})
export class AppComponent{
    countries = [
       {id: 1, name: "United States"},
       {id: 2, name: "Australia"}
       {id: 3, name: "Canada"},
       {id: 4, name: "Brazil"},
       {id: 5, name: "England"}
     ];
    selectedValue = null;
}

এই ক্ষেত্রে, এটি প্রদর্শিত selectedValueহবে যা একটি সংখ্যা হবে - নির্বাচিত আইটেমটির আইডি।

যাইহোক, আমি আসলে দেশটির সাথে নিজেকে যুক্ত করতে চাই যাতে selectedValueকেবল আইডির চেয়ে অবজেক্টটি। আমি বিকল্পটির মানটি এভাবে পরিবর্তনের চেষ্টা করেছি:

<option *ngFor="#c of countries" value="c">{{c.name}}</option>

তবে এটি কাজ করছে বলে মনে হয় না। মনে হচ্ছে এটি আমার মধ্যে একটি অবজেক্ট selectedValueরাখবে - তবে আমি যে বস্তুর প্রত্যাশা করছি তা নয়। আপনি আমার Plunker উদাহরণ এ দেখতে পারেন ।

আমি পরিবর্তনের ইভেন্টের সাথেও বাধ্যতামূলক চেষ্টা করেছি যাতে আমি নির্বাচিত আইডির ভিত্তিতে অবজেক্টটি নিজেকে সেট করতে পারি; যাইহোক, এটি প্রদর্শিত হবে যে এনজিওমোডেল সীমাবদ্ধ আপডেট হওয়ার আগে পরিবর্তিত ইভেন্টটি আগুন ধরে যায় - যার অর্থ আমার কাছে সেই সময়ে নবনির্বাচিত মানটিতে অ্যাক্সেস নেই।

কৌণিক 2 দিয়ে কোনও বস্তুর সাথে একটি নির্বাচিত উপাদানকে বেঁধে রাখার কি কোনও পরিষ্কার উপায় আছে?


বুঝতে পেরেছি যে আমার প্লাঙ্ক IE বনাম ক্রোমে কিছুটা আলাদাভাবে কাজ করে। কেউই বাস্তবে আমার ইচ্ছা মতো কাজ করে না, তবে এফওয়াইআই।
আরহরিস

উত্তর:


733
<h1>My Application</h1>
<select [(ngModel)]="selectedValue">
  <option *ngFor="let c of countries" [ngValue]="c">{{c.name}}</option>
</select>

স্ট্যাকব্লিটজ উদাহরণ

দ্রষ্টব্য: আপনি সি ব্যবহারের [ngValue]="c"পরিবর্তে ব্যবহার করতে পারেন [ngValue]="c.id"সম্পূর্ণ দেশীয় বস্তু।

[value]="..."স্ট্রিং মানগুলি কেবল
[ngValue]="..."কোনও প্রকারকে সমর্থন করে

হালনাগাদ

যদি valueএকটি বস্তু হয়, পূর্বনির্বাচিত উদাহরণটি মানগুলির সাথে একটির মতো হওয়া দরকার।

.0.০.০-বিটা since.২০১ since থেকে উপলব্ধ সম্প্রতি যুক্ত হওয়া কাস্টম তুলনা https://github.com/angular/angular/issues/13268 দেখুন

<select [compareWith]="compareFn" ...

অ্যাক্সেস করতে যদি তুমি চাও যত্ন নিন thisমধ্যে compareFn

compareFn = this._compareFn.bind(this);

// or 
// compareFn = (a, b) => this._compareFn(a, b);

_compareFn(a, b) {
   // Handle compare logic (eg check if unique ids are the same)
   return a.id === b.id;
}

21
এটি চেষ্টা করা হয়েছে তবে এটি কেবল ড্রপডাউন থেকে মডেল পর্যন্ত ডেটা-বাইন্ডের মতো বলে মনে হচ্ছে না। মডেলটির সাথে পৃষ্ঠাতে প্রবেশ করা থাকলে ইতিমধ্যে ড্রপডাউন সেট করা নেই ...
স্ট্রাইন্ডার

13
@ স্ট্রিন্ডারে ঘন ঘন ভুলটি (ডিফল্ট আইটেম) এর selectedValueচেয়ে অন্য অবজেক্টের উদাহরণটি ব্যবহার করা c। একই বৈশিষ্ট্য এবং মানগুলি সহ একটি পৃথক বস্তু কাজ করে না, এটি একই অবজেক্ট উদাহরণ হতে হবে।
গন্টার জ্যাচবাউর

1
@ গন্তেরজ্যাচবাউর হ্যাঁ ইতিমধ্যে চিন্তাভাবনা। সুতরাং মডেল এবং মানগুলির তালিকার সাথে সরাসরি সিঙ্ক করার কোনও সহজ উপায় নেই? = সর্বদা অন চেঞ্জের মাধ্যমে?
স্ট্রাইন্ডার

1
শীঘ্রই আমরা কাস্টম তুলনামূলক ফাংশনটি ব্যবহার করে এনজিমোডেল অবজেক্টগুলিকে তাদের সম্পত্তি দ্বারা তুলনা করতে সক্ষম হতে পারি। এই সমস্যাটি কেবল দেখুন: github.com/angular/angular/issues/13268
kub1x

1
এটা সবসময় সহজ একবার আপনি এটা জানেন এর ;-) কিন্তু angular.io/api/forms/NgSelectOption#description একটি লিঙ্ক রয়েছে angular.io/api/forms/SelectControlValueAccessor ভাল ডক্সের সঙ্গে।
গন্টার জ্যাচবাউর

41

এটি সাহায্য করতে পারে:

    <select [(ngModel)]="selectedValue">
          <option *ngFor="#c of countries" [value]="c.id">{{c.name}}</option>
    </select>

5
আমি [ngValue] এর পরিবর্তে [মান] ব্যবহার করেছি। এটি একই না. এটি আমার জন্য কাজ করেছে
ক্যারোলিনা

2
কৌনিক 4
-

2
@ সমুদ্র কেজি letপরিবর্তে ব্যবহার করুন#
আশরাফুল ইসলাম

1
এই উত্তরটি নির্বাচিত মানটি পায় না
সান জাইসি

20

আপনি [(ngModel)]নিজের <select>ট্যাগ ব্যবহার করার প্রয়োজন ছাড়াই এটিও করতে পারেন

আপনার টিএস ফাইলে একটি ভেরিয়েবল ঘোষণা করুন

toStr = JSON.stringify;

এবং আপনার টেমপ্লেটে এটি করুন

 <option *ngFor="let v of values;" [value]="toStr(v)">
      {{v}}
 </option>

এবং তারপরে ব্যবহার করুন

let value=JSON.parse(event.target.value)

বৈধ জাভাস্ক্রিপ্ট অবজেক্টে স্ট্রিংটিকে আবার পার্স করতে


1
এটি প্রকৃতপক্ষে করণীয়, তবে বড় আকারের বস্তুগুলিতে ব্যথা হয়ে উঠবে। এছাড়াও, পরিবর্তন সনাক্তকরণের কৌণিকের আন্ডারলাইন ক্ষমতা চিন্তা করার মতো কিছু। জসন হিসাবে আউটপুটিং তথ্য, বট দ্বারা সহজেই পার্সেবল, পারফরম্যান্সের হালকে যুক্ত করে। কৌণিক পরিবর্তনের সনাক্তকরণ ব্যবহারের মাধ্যমে ডেটার লজিক লুকিয়ে থাকে (encapsulates) এবং আপনার প্রয়োজনীয় তথ্য আপনাকে আশ্বাস দেয়। @ গন্টার জ্যাচবাউরের উত্তরটি কৌণিক ভাষায় এটি করার উপায়। :)
লুকাসি আন্দ্রেই

আমাকে সাহায্য করেছিল যেখানে আমার একটি তালিকা রয়েছে এবং একটি মান পরিবর্তন করার সাথে সাথে পরবর্তীটি আপডেট করা উচিত নয় এটি এনজিএমডেল ব্যবহার না করে এটি হ্যাক হিসাবে ব্যবহার করতে সহায়তা করেছে, ধন্যবাদ :)
মেলভিন

এটি সরল জাভাস্ক্রিপ্ট অবজেক্টের জন্য কাজ করে তবে আপনি যে শ্রেণীর সমস্ত পদ্ধতি হারাবেন তার উদাহরণের জন্য নোট করুন।
খলিল রাভান্না

13

এটি আমার পক্ষে কাজ করেছে:

টেমপ্লেট এইচটিএমএল:

আমি যোগ (ngModelChange)="selectChange($event)"আমার কাছে select

<div>
  <label for="myListOptions">My List Options</label>
  <select (ngModelChange)="selectChange($event)" [(ngModel)]=model.myListOptions.id >
    <option *ngFor="let oneOption of listOptions" [ngValue]="oneOption.id">{{oneOption.name}}</option>
  </select>
</div>

घटक.ts এ:

  listOptions = [
    { id: 0, name: "Perfect" },
    { id: 1, name: "Low" },
    { id: 2, name: "Minor" },
    { id: 3, name: "High" },
  ];

এই ফাংশনটিতে আপনাকে একটি যুক্ত করতে component.tsহবে:

  selectChange( $event) {
    //In my case $event come with a id value
    this.model.myListOptions = this.listOptions[$event];
  }

দ্রষ্টব্য: আমি চেষ্টা করছি [select]="oneOption.id==model.myListOptions.id"এবং কাজ করছি না।

============== অন্য উপায় হতে পারে: ==========

টেমপ্লেট এইচটিএমএল:

আমি যোগ [compareWith]="compareByOptionIdআমার কাছে select

<div>
  <label for="myListOptions">My List Options</label>
  <select [(ngModel)]=model.myListOptions [compareWith]="compareByOptionId">
    <option *ngFor="let oneOption of listOptions" [ngValue]="oneOption">{{oneOption.name}}</option>
  </select>
</div>

घटक.ts এ:

  listOptions = [
    { id: 0, name: "Perfect" },
    { id: 1, name: "Low" },
    { id: 2, name: "Minor" },
    { id: 3, name: "High" },
  ];

এই ফাংশনটিতে আপনাকে একটি যুক্ত করতে component.tsহবে:

 /* Return true or false if it is the selected */
 compareByOptionId(idFist, idSecond) {
    return idFist && idSecond && idFist.id == idSecond.id;
 }

আপনি যদি অতিরিক্ত কিছু করার জন্য পরিবর্তন ইভেন্টটি পরিচালনা করতে চান তবে এটি ভাল (যেমন একটি পরিবর্তন কলব্যাককে জানান) inform যদিও সেক্ষেত্রে আপনাকে কেবল [ngModel]নিজের মডেলটিকে নিজের কাস্টম চেঞ্জ কলব্যাকটিতে সংজ্ঞায়িত করে ম্যানুয়ালি সেট করা এবং সেট করতে হবে (ngModelChange)
21:25

9

প্রতিক্রিয়াশীল ফর্মগুলি ব্যবহার করে কেউ যদি একই কাজ করতে দেখছে:

<form [formGroup]="form">
  <select formControlName="country">
    <option *ngFor="let country of countries" [ngValue]="country">{{country.name}}</option>
  </select>
  <p>Selected Country: {{country?.name}}</p>
</form>

এখানে কাজের উদাহরণটি দেখুন


5

আপনি একটি ফাংশন ব্যবহার করে আইডি নির্বাচন করতে পারেন

<option *ngFor="#c of countries" (change)="onchange(c.id)">{{c.name}}</option>

4

আমার পক্ষে এটির মতো কাজ করা, আপনি কনসোল করতে পারেন event.target.value

<select (change) = "ChangeValue($event)" (ngModel)="opt">   
    <option *ngFor=" let opt of titleArr" [value]="opt"></option>
</select>

2

এছাড়াও, যদি প্রদত্ত সমাধানগুলি থেকে অন্য কোনও কাজ না করে, আপনি "অ্যাপমোডুল" এর ভিতরে "ফর্মমডুল" আমদানি করেছেন কিনা তা পরীক্ষা করে দেখুন, এটি আমার জন্য কী ছিল।


2

নির্বাচিত আইটেমের জন্য আরেকটি গেটর তৈরি করুন

<form [formGroup]="countryForm">
  <select formControlName="country">
    <option *ngFor="let c of countries" [value]="c.id">{{c.name}}</option>
  </select>

  <p>Selected Country: {{selectedCountry?.name}}</p>
</form>

টিএসে:

get selectedCountry(){
  let countryId = this.countryForm.controls.country.value;
  let selected = this.countries.find(c=> c.id == countryId);
  return selected;
}

1

ফাংশনের মাধ্যমে নির্বাচিত মানটি পাস করে আপনি ক্লিক () এর সাহায্যে নির্বাচিত মানও পেতে পারেন

<md-select placeholder="Select Categorie"  
    name="Select Categorie" >
  <md-option *ngFor="let list of categ" [value]="list.value" (click)="sub_cat(list.category_id)" >
    {{ list.category }}
  </md-option>
</md-select>

0

এইভাবে ব্যবহার করুন ..

<h1>My Application</h1>
<select [(ngModel)]="selectedValue">
     <option *ngFor="let c of countries" value="{{c.id}}">{{c.name}}</option>
 </select>

0

ইন app.component.html:

 <select type="number" [(ngModel)]="selectedLevel">
          <option *ngFor="let level of levels" [ngValue]="level">{{level.name}}</option>
        </select>

এবং app.component.ts:

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  levelNum:number;
  levels:Array<Object> = [
      {num: 0, name: "AA"},
      {num: 1, name: "BB"}
  ];

  toNumber(){
    this.levelNum = +this.levelNum;
    console.log(this.levelNum);
  }

  selectedLevel = this.levels[0];

  selectedLevelCustomCompare = {num: 1, name: "BB"}

  compareFn(a, b) {
    console.log(a, b, a && b && a.num == b.num);
    return a && b && a.num == b.num;
  }
}

0

<select name="typeFather"
    [(ngModel)]="type.typeFather">
        <option *ngFor="let type of types" [ngValue]="type">{{type.title}}</option>
</select>

যে পদ্ধতির সর্বদা কাজ করবে, তবে আপনার যদি একটি গতিশীল তালিকা থাকে তবে নিশ্চিত হয়ে নিন যে আপনি এটি মডেলের আগে লোড করেছেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.