2015-04-07 66 views
3

我有一個在Ember控制器上定義的計算屬性myArray,該控制器返回一個數組。該陣列應初始化爲model的內容,然後根據用戶輸入的查詢過濾model重新進行計算。如何初始化控制器的計算屬性以在Ember中建模?

myArray: function() { 
    // return a value that filters model with query 
}.property('model', 'query') 

的問題是,我無法弄清楚如何在同一時間兩者都做。以下不能將myArray初始化爲model;我猜測是因爲模型異步加載,並且init()在它完成之前運行。

// doesn't work 
init: function() { 
    this._super(); 
    this.set('myArray', this.get('model')); 
} 

所以我認爲setupController()是設置它的地方,但我發現,設置myArray有導致過濾器更新不工作,也許是因爲我被覆蓋的定義。

// route definition... 
setupController: function(controller, model) { 
    controller.set('model', model); 
    controller.set('myArray', model); // breaks updating 
} 

我該如何實現我的目標?

回答

2

你想計算屬性取決於model - 你不必初始化它,它只是返回正確的事情。

// untested, just to show the idea 
myArray: function() { 
    var query = this.get('query'); 
    var model = this.get('model'); 

    if (query) 
     return doSomethingWith(model, query); 
    else 
     return model; 
}.property('model', 'query') 

由於它是一個屬性,初始化和更新將自行進行。

這就是說,Twitter的絕殺是.property的使用將被勸阻,更好地使用Ember.computed

// untested, just to show the idea 
myArray: Ember.computed('model', 'query', function() { 
    var query = this.get('query'); 
    var model = this.get('model'); 

    if (query) 
     return doSomethingWith(model, query); 
    else 
     return model; 
}) 

這只是寫它的另一種方式,並且從長遠來看可能是mor未來的證明。

+0

設置該值不會覆蓋計算出的屬性,它會像調用者那樣調用計算的屬性,如[這裏]所述(http://guides.emberjs.com/v1.11.0/object-model/computed-properties /)。 – GJK

+0

我的不好。感謝您指出。我改變了我的答案以反映這一點。 – jnfingerle

1

嘗試:

myArray: function() { 
    this.set('myArray', this.get('model'); 
}.property('model', 'query') 
1

編輯:我不知道爲什麼我會用迂迴的方式做事。我想我只是想說明計算屬性也可以作爲setter。這也將同樣的方式工作:

myArray: function() { 
    return this.get('model').filter(function(item) { 
     return (item.property_you_want_to_filter_by === true); 
    }); 
}.property('[email protected]_you_want_to_filter_by', 'query') 

Ember shorthand也將工作:

myArray: Ember.computed.filter('model', function(item) { 
    return (item.property_you_want_to_filter_by === true); 
}); 

你需要採取的事實,計算性能幹將制定者的優勢。

myArray: function(key, value) { 
    // This is the setter 
    if (arguments.length > 1) { 
     this.set('_myArray', value); 
    } 

    // This is the getter 
    // Do your filtering with `query` here 
    return this.get('_myArray').filter(function(item) { 
     return (item.selected === true); 
    }); 
}.property('_myArray', 'query') 

因爲你只把它當你得到一個新的模式,你可以存儲(在這種情況下_myArray)在控制器上的私有屬性的值。然後對於getter,可以使用存儲在該屬性中的值與查詢結合來返回所需的值。在我上面的例子中,我已經篩選出每個未選​​擇的項目。

+0

「灰燼速記」缺少「模型」作爲第一個參數。也就是說,如果過濾器確實是由包含的過濾器函數支持的某種邏輯,這確實是最短的版本。 – jnfingerle

相關問題