2012-08-15 49 views
2

在Ember.js ArrayController中查找物品的正确方法是什么?我在控制器中设置了一组触点:在Ember ArrayController中查找物品

App.contactsController = Em.ArrayController.create({ 
    content:[], 
}); 

控制器中有一些对象,它们显示出来并且一切正常。然后,我想实现具有序列化/反序列化的路由器:

... 
deserialize:function (router, params) { 
    var contact = App.contactsController.find(function(item) { 
     return item.id == params.contact_id; 
    }); 
}, 
... 

但是,find函数似乎没有做任何迭代。可能是什么原因?在应用程序调用其ready方法之前,路由器是否可能尝试执行路由?这是我用控制器填充数据的地方。

编辑:好的,我发现路由器试图在数据填充我的arrayController之前进行过渡(在Ember.Application.ready方法中)。数据设置正确后,是否可以“延迟”路由?

回答

0

这个问题实际上是由于在路由器进行反序列化之后,将数据插入到arrayController中导致的。把它放在App.initialize()之前解决了这个问题。

0
var contact = App.contactsController.filter(function(item) { 
    return item.id == params.contact_id; 
}); 

我想你可以在设置路由器时运行Application.initialize()。您可以使用观察者来检测数据集。

dataChanged: function() { 
    console.log(this.get('content.length')); 
    // before emberjs 1.0pre 
    // console.log(this.getPath('content.length')); 
}.observes('content') 
0

正确的答案是:

var contact = App.contactsController.content.find(function(item) { 
    return item.id == params.contact_id; 
}); 

如果不指向的内容阵列它不会返回一个项目。