একটি নির্বাচিত ট্যাগে এনজিমোডেলে পরিবর্তন সনাক্ত করুন (কৌণিক 2)


99

আমি ngModelএকটি <select>ট্যাগে একটি পরিবর্তন সনাক্ত করার চেষ্টা করছি । কৌণিক 1.x এ, আমরা $watchএটি অন ngModelদ্বারা বা ব্যবহার করে সমাধান ngChangeকরতে পারি, তবে ngModelকৌনিক 2 তে পরিবর্তন কীভাবে সনাক্ত করতে হয় তা আমি এখনও বুঝতে পারি নি ।

সম্পূর্ণ উদাহরণ : http://plnkr.co/edit/9c9oKH1tjDDb67zdKmr9?p=info

import {Component, View, Input, } from 'angular2/core';
import {FORM_DIRECTIVES} from 'angular2/common';

@Component({
    selector: 'my-dropdown'
})
@View({
    directives: [FORM_DIRECTIVES],
    template: `
        <select [ngModel]="selection" (ngModelChange)="onChange($event, selection)" >
            <option *ngFor="#option of options">{{option}}</option>
        </select>
        {{selection}}
    `
})
export class MyDropdown {
    @Input() options;

    selection = 'Dog';

    ngOnInit() {
        console.log('These were the options passed in: ' + this.options);
  }

  onChange(event) {
    if (this.selection === event) return;
    this.selection = event;
    console.log(this.selection);
  }

}

যেমন আমরা দেখতে পাচ্ছি, যদি আমরা ড্রপডাউন থেকে আলাদা মান নির্বাচন করি তবে আমাদের ngModelপরিবর্তনগুলি এবং ভিউতে অন্তরবিচ্ছিন্ন প্রকাশটি এটি প্রতিফলিত করে।

আমি আমার শ্রেণি / নিয়ামকের এই পরিবর্তন সম্পর্কে কীভাবে জানব?


4
আপনি অতিরিক্ত কিছু মন্তব্য রাখতে চান; আপনি চান না যে এই প্রশ্নটিকে ছদ্মবেশে একটি অভিজাত হিসাবে চিহ্নিত করা উচিত। stackoverflow.com/help/dont-ask
Claies

উত্তর:


238

আপডেট :

ইভেন্ট এবং সম্পত্তির বাইন্ডিংগুলি পৃথক করুন:

<select [ngModel]="selectedItem" (ngModelChange)="onChange($event)">
onChange(newValue) {
    console.log(newValue);
    this.selectedItem = newValue;  // don't forget to update the model here
    // ... do other stuff here ...
}

আপনি ব্যবহার করতে পারে

<select [(ngModel)]="selectedItem" (ngModelChange)="onChange($event)">

এবং তারপরে আপনাকে ইভেন্ট হ্যান্ডলারে মডেলটি আপডেট করতে হবে না, তবে আমি বিশ্বাস করি এটির ফলে দুটি ঘটনাই আগুন ধরিয়ে দেয়, সুতরাং এটি সম্ভবত কম দক্ষ।


পুরানো উত্তর, তারা বিটা ১ এ কোনও বাগ ঠিক করার আগে:

একটি স্থানীয় টেম্পলেট ভেরিয়েবল তৈরি করুন এবং একটি (change)ইভেন্ট সংযুক্ত করুন :

<select [(ngModel)]="selectedItem" #item (change)="onChange(item.value)">

plunker

আরও দেখুন কীভাবে আমি কৌনিক 2 তে "নির্বাচন" করে নতুন নির্বাচন পেতে পারি?


4
সুতরাং ngModelযদি আমি কেবল একটি নতুন ভেরিয়েবল বাঁধাই এর বিন্দু কি item? ngModelইভেন্ট শ্রোতাদের অর্জনের জন্য প্রথম বন্ধনী মোড়ানোর বিষয়টি নয় , তবে কেন আমরা একটি নতুন পরিবর্তনশীল প্রবর্তন করছি?
লাক্স

4
@ ফ্ল্যাক্স, হ্যাঁ ভাল প্রশ্ন। selectedItemআমাদের সীমাবদ্ধ ডেটা, যা এনজিএমডেল আমাদের জন্য স্বয়ংক্রিয়ভাবে আপডেট হয় তবে ... এটি আমাদের পরিবর্তনের বিষয়ে অবহিত করে না, যা প্রায়শই যথেষ্ট ভাল (মতামত এবং এ জাতীয় আপডেট হবে), তবে অবশ্যই আপনার ব্যবহারের ক্ষেত্রে এটি যথেষ্ট ভাল নয় good আমি উল্লেখ করা অন্যান্য এসও প্রশ্নে আমি কীভাবে (ngModelChange)পরিবর্তনের বিষয়ে বিজ্ঞপ্তি পেতে ব্যবহার করার চেষ্টা করেছি তা বর্ণনা করি তবে প্রতিটি পরিবর্তনের জন্য এটি দু'বার কল হয়ে যায়। আমি জানিনা যে এটি বাগ কিনা বা না। যাইহোক, (change)ইভেন্টের বাইন্ডিং যুক্ত করা সমস্যার সমাধান বলে মনে হচ্ছে।
রাজকক

এছাড়াও, আমি প্লাঙ্কার আপডেট করেছি যা দেখায় যে আগুনের selectedItemসময় আপডেট হয় না onChange(), তাই মনে হয় আমাদের সেই স্থানীয় টেম্পলেট পরিবর্তনশীল দরকার।
রাজকোক

@ ফ্লাক্স #বা #itemআমাদের ক্ষেত্রে একটি স্থানীয় রেফারেন্স। সুতরাং আমরা কেন item.changeসেখানে করতে সক্ষম ।
মার্ক পাইসাক - ট্রিলন.ও

@ ফ্লাক্স, আমি ইতিমধ্যে হুক ইন করার উপায়টি বর্ণনা করেছি: ngModelChangeকাস্টম ইভেন্টের সাথে আবদ্ধ । সমস্যাটি হ'ল, <select>প্রতিটি পরিবর্তনের জন্য এই ইভেন্টটি দু'বার ছড়িয়ে পড়ে।
রাজকোককে চিহ্নিত করুন

12

আমি এই প্রশ্নটি দেখে হোঁচট খেয়েছি এবং আমি আমার উত্তরটি জমা দেব যা আমি ব্যবহার করেছি এবং বেশ ভাল ব্যবহার করেছি। আমার কাছে একটি অনুসন্ধান বাক্স ছিল যা ফিল্টার করে এবং বস্তুর অ্যারে এবং আমার অনুসন্ধান বাক্সে আমি এটি ব্যবহার করেছিলাম(ngModelChange)="onChange($event)"

আমার মধ্যে .html

<input type="text" [(ngModel)]="searchText" (ngModelChange)="reSearch(newValue)" placeholder="Search">

তারপরে আমার মধ্যে component.ts

reSearch(newValue: string) {
    //this.searchText would equal the new value
    //handle my filtering with the new value
}

4
শুধুমাত্র FYI, যখন থেকে বাঁধাই ngModelChange, $eventএকটি DOM নয় ইভেন্ট । বরং এটি ফর্ম উপাদানটির বর্তমান মান, যা কোনও ইনপুট উপাদানের স্ট্রিং।
রাজকক

@ মারকরাজকোক আপনি কি দয়া করে আমাকে এর জন্য ডকুমেন্টেশনের দিকে নির্দেশ করতে পারেন, তাই আমি কী আমার বাকী দেব দলের সাথে ভাগ করে নিতে পারি?
নিল এস

4
@ নিলস, নিকটতমটি কৌণিক.আইও / ডকস / টিএসস / স্লেটস / গাইড / স্টেপলেট- সাইন্ট্যাক্স এইচটিএমএল#!#ng মডেল
মার্ক রাজকক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.