我試圖使用動態路由基於搜索字符串過濾數據。在控制器中使用transitionToRoute
函數時,路由中的模型數據將返回到視圖的正確位置,但是,直接導航到url或刷新頁面時,所有forEach調用都未執行,因爲模型中數據的長度爲0.Ember.js過濾來自動態路由的數據
我有一種感覺,這是因爲數據異步加載,但我不知道如何延遲forEach循環和視圖的渲染,直到find
的承諾解決和forEach循環已完成。
這裏是我的路由器的model
功能:
model : function(params){
var lists = App.List.find(), //gets all the lists
query = params.query, //query string from url
re = new RegExp(query, 'i');
this.set('query', query);
return lists.forEach(function(list){
var cards = list.get('cards').forEach(function(card){
//the view has a class bound to the hide property of each card
card.set('hide',
(query.length) ? !(re.test(card.get('description'))) : false
);
});
return list;
});
}
當用戶點擊帶的#/search/red
查詢字符串的URL我想只有那些「紅」在他們返回的卡的應用。
是的,這絕對是因爲異步調用。你可以創造你自己的承諾。但是這段代碼看起來有點難看。我建議在控制器上設置搜索查詢,該控制器包含列表。這個控制器然後可以用一個計算的屬性過濾你的列表。您的方法非常重要,而Ember想要宣傳聲明式編程。 – mavilein
@mavilein謝謝,我正在開始這條路,但我有問題將查詢參數傳遞到控制器。我很樂意看到您的評論作爲答案的例子(如果是其他內容,我可以投票) – bittersweetryan
爲什麼不直接將參數傳遞給'find()'方法並讓後端完成工作(除非你使用夾具數據當然)? – kroofy