2013-06-05 140 views
0

我試圖按相關內容篩選某些內容。我遇到的麻煩是,當我嘗試過濾時,相關內容未必會被加載。我試過使用then()函數,但無法訪問範圍之外的變量。以下是我已經試過按相關模型篩選模型

var filter = this.get('categoryFilter').toLowerCase(); 
App.Category.find().then(function() { 
content = this.get('content').filter(function(item) { 
    return item.get('category.name').toLowerCase() === filter; 
    // ERROR! filter variable doesn't exist here 
    }, this); 
}); 

過濾不then()失敗的第一次,但之後它屢試不爽,因爲數據是那麼已經加載。

什麼是篩選列表的最佳方式?

+0

很明顯..這個答案不適合你嗎? – ianpetzer

+0

問題更多的是關於如何在承諾中過濾,而不是實際的過濾本身。我看了一下這個ember-data代碼,然後我意識到我可以在promise語境中調用一個控制器函數。 – Gevious

回答

1

您可以使用filterProperty功能篩選RecordArray:http://emberjs.com/api/classes/Ember.Enumerable.html#method_filterProperty

試着這麼做:

var filteredCategories = App.Category.find().filterProperty('nameLowerCase', filter); 

在您的類別,您將需要一個屬性來對

App.Category = Ember.Object.extend({ 

    name: '', 

    nameLowerCase: function() { 
    return this.get('name').toLowerCase(); 
    }.property('name') 

}); 

運行過濾器假設您有一個CategoriesRoute將Categories控制器的模型設置爲App.Category.find(),那麼您可以使用以下代碼可以訪問過濾列表從您的模板:

App.CategoriesController = Ember.Array.extend({ 

    filtered: function() { 
    var filter = 'String value to compare lower case name to'; 
    return this.get('model').filterProperty('nameLowerCase', filter); 

    }.property('[email protected]') 
}); 

然後在你的模板,你可以使用:

{{#each filtered}} 
    //Your code here 
{{/each}} 

編輯2013年6月6日...注意filterProperty現在被稱爲上App.Category.find()

+0

我不確定你有DS.Model上的filterProperty類的方法,但是你有DS.Model.filter(),它可以做同樣的事情,並返回一個實時數組。我認爲這可能是這個問題的解決方案(以及http://stackoverflow.com/questions/16936956/set-controllers-content-without-model-hook)cc/@Gevious –

+0

你是對的。 filterProperty是Enumerable mixin上的一個方法,所以需要在App.Category.find()上調用它。我已經更新了我的答案以顯示此內容..... http://emberjs.com/api/classes/Ember.Enumerable.html#method_filterProperty – ianpetzer

+0

filterProperty已棄用支持filterBy https://github.com/emberjs /網站/拉/ 882 – Micah