【发布时间】:2013-08-29 18:02:24
【问题描述】:
我正在尝试使用动态路由根据搜索字符串过滤数据。当从控制器使用transitionToRoute 函数时,来自路由的模型数据会正确返回到视图,但是当直接导航到 url 或刷新页面时,所有的 forEach 调用都不会被执行,因为数据的长度在模型为 0。
我有一种感觉,这是因为数据是异步加载的,但我不确定如何延迟 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 谢谢,我从这条路开始,但是我在将查询参数传递到控制器时遇到问题。我很乐意看到您的评论示例作为答案(如果还有其他问题,我可以投票)
-
为什么不直接将参数传递给
find()方法并让后端完成工作(当然,除非您使用的是夹具数据)?
标签: javascript ember.js