2013-03-01 123 views
1

我有這個測試應用程序應該打印「過濾」和「改變」每次點擊應用程序視圖,因爲計算屬性被調用。然而屬性結合使用空數組更新屬性時才觸發:ComputedProperty沒有得到更新

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

爲什麼設置設置爲空數組時屬性綁定,才觸發?爲什麼在超時時手動進行觸發呢?

更新

這裏是一個工作jsbin:http://jsbin.com/edolol/11/edit

回答

2

當你要添加/從陣列中刪除項目,而不是改變整個數組,你需要告知物業計算,觀察該數組裏面的物品,不僅數組本身:

的語法是:

function() { 
}.property('[email protected]') 

它與setTimeout工作的原因是因爲你是更換整個陣列,而不是裏面的物品。

我定你的jsbin:http://jsbin.com/edolol/10/edit

我修正了一些小的其他的東西,如filter.push現在filter.pushObject(使用Ember的MutableArray)。

而改變濾波器陣列(filter = filter.filter()),你需要新的filter變量設置爲屬性後:App.set('Settings.filter', filter);

+0

是從[]到MutableArray自動發生轉換?沒有你的小修改,'。@ each'的東西就無法工作(正如你可以看到你是否從jsbin的修訂版本3到版本9一樣循環)。 – ohcibi 2013-03-01 13:48:04

+2

是的,Ember將所有數組自動轉換爲'MutableArray'。你可以定義一個數組var a = [],並使用'a.forEach','a.pushObject','a.find'和所有其他函數。 – 2013-03-01 13:57:35

0

的問題是,我已經使用.push()添加到App.Settings.filter.filter()從而除去。第一種方法不會創建一個新的數組,後者會這樣做。這就是爲什麼從該陣列中刪除已經工作,但沒有添加。

我假設使用Ember.ArrayProxy和觀察者爲[email protected]會工作。但那是出於我的知識。這個小問題可以通過創建一個新的數組來解決。

filter = App.get('Settings.filter').slice(0);