1

計算されたプロパティが呼び出されるため、アプリケーションビューがクリックされるたびに「フィルター処理済み」および「変更済み」を出力する必要があるこのテストアプリケーションがあります。ただし、プロパティ バインディングは、空の配列でプロパティを更新する場合にのみトリガーされます。

window.App = Ember.Application.create({
  Settings: Ember.Object.create({
    filter: []
  }),

  ApplicationView: Ember.View.extend({
    click: function(event) {
      filter = App.get('Settings.filter');
      console.dir(filter);
      if (App.get('Room.filtered')) {
        filter = filter.filter(function(item) {
          return item != App.get('Room.name');
        });
      } else {
        filter.push(App.get('Room.name'));
      }
      App.set('Settings.filter', filter);
    }
  })
});

Room = Ember.Object.extend({
 name: "test",
 _filterer: function() {
   console.dir("changed");
 }.observes('filtered'),
 filtered: function() {
   console.dir("filtered");
   filter = App.get('Settings.filter');
   for (var i = 0; i < filter.length; i++) {
     if (filter[i] == this.get('name')) return true;
   }
   return false;
 }.property('App.Settings.filter', 'name').volatile()
});

App.Room = Room.create();

setTimeout(function() {App.set('Settings.filter', ['test']); }, 3000);

ここに jsbin があります: http://jsbin.com/edolol/2/edit

Setting を空の配列に設定した場合にのみプロパティ バインドがトリガーされるのはなぜですか? また、タイムアウト中に手動で実行するとトリガーされるのはなぜですか?

アップデート

動作中の jsbin は次のとおりです: http://jsbin.com/edolol/11/edit

4

2 に答える 2

3

配列全体を変更するのではなく、配列からアイテムを追加/削除する場合は、配列自体だけでなく、配列内のアイテムを監視するように計算されたプロパティに通知する必要があります。

構文は次のとおりです。

function() {
}.property('App.settings.filter.@each')

それが機能していた理由setTimeoutは、配列内の項目ではなく配列全体を置き換えていたためです。

jsbin を修正しました: http://jsbin.com/edolol/10/edit

filter.push現在のようないくつかのマイナーな他のものを修正しましたfilter.pushObject(Emberのを使用MutableArray)。

フィルター配列 ( ) を変更した後、新しい変数をプロパティとしてfilter = filter.filter()設定する必要があります。filterApp.set('Settings.filter', filter);

于 2013-03-01T13:39:37.350 に答える
0

問題は、私が以前.push()に追加しApp.Settings.filterたり.filter()削除したりしていたことです。最初のアプローチは新しい配列を作成しませんが、後者は作成します。そのため、その配列からの削除は機能しましたが、追加は機能しませんでした。

Ember.ArrayProxyとオブザーバーを使用すると.@eachうまくいくと思います。しかし、それは私の知識の外です。ただし、この小さな問題は、新しい配列を作成するだけで解決されます。

filter = App.get('Settings.filter').slice(0);
于 2013-03-01T13:38:12.510 に答える