我试图使用动态路由基于搜索字符串过滤数据。在控制器中使用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