0

私のcomponent.js内で、以下のコンポーネントプロパティを観察しています..

valueObserver : function(){
  console.log('which item changed??')
}.observes('list.@each.isChecked'),

どのアイテム isChecked が変更されたかを調べるにはどうすればよいですか?


完全なコンポーネント コードは以下のとおりです

Ember.Component.extend({
  user: undefined,
  list: undefined,
  init: function() {
    this._super();
  },
  visibilityChanged: function() {
    if(this.get('isVisible')) {
      var _this = this;
      var account = this.get('accountService').get('account');

      this.get('user').getLists(account.get('uid'))
        .then(function(response) {
          var items = response.map(function(item) {
            item.isChecked = false
            return item;
          });
           _this.set('list', items);
        });
    }
  }.on('init').observes('isVisible'),

  valueObserver : function(){
    this.get('list').forEach(function(item) {
      if (item.get('isDirty')) {
        // Item has changed
      }
    });
  }.observes('list.@each.isChecked')
});
4

1 に答える 1

1

同様の機能を実現するハックな方法があります。リスト アイテムが Ember モデルの場合、どのアイテムが「ダーティ」であるか (つまり、コンテンツがユーザーによって変更されたが保存されていない) を探すことができます。

valueObserves: function() {
  this.get('list').forEach(function(item) {
    if (item.get('isDirty')) {
      // Item has changed
    }
  });
}.observes('list.@each.isChecked'),

ただし、このアプローチは不要なパフォーマンスの低下であり、使用例が限られているため、お勧めしません。

代わりに、Oren が提案したように、コレクション ビューのようなものをコンポーネント内またはコンポーネントの代わりに利用する必要があります。そのコレクション ビューには、各リスト アイテムのアイテム ビューがあります。アイテムではisChecked、アクションを観察してコンポーネントに送信し (またはコンポーネントのメソッドを呼び出すだけ)、アイテム ビューのコンテンツ (リスト アイテム) を渡すことができます。

代替アプローチ

別の方法は、アクションを使用して isChecked プロパティを設定することです。

{{#each item in list}}
  // This could even be a checkbox with the checked attr bound
  <button {{action 'toggleCheck' item}}>Icon</button>
{{/each}}

これにより、isChecked を設定できるコントローラーに項目が送信され、項目にすぐにアクセスできるようになります。

Ember.ArrayController.extend({
  actions: {
    toggleCheck: function(item) {
      item.toggleProperty('isChecked');
      // Now do whatever you wanted to do
    }
  }
});
于 2015-02-03T14:48:39.470 に答える