我正在使用没有余烬数据的新Router
,因此我必须为动态网址细分实现自己的serialize
/ deserialize
。
我有一个ArrayController
,其中填充了Application#ready
中的数据。
为了简单起见,我们假设我有两条路线:item > '/item/:item_id'
& items > '/items'
。
item
路线中的反序列化方法看起来像是
deserialze: function(router, params){
return router.get('myController')
.findProperty('id', params['item_id']);
}
如果我在items
路线上初始化我的应用并通过item
导航到特定项目的{{action}}
路线,一切正常。此外,在此之后,我可以手动将网址更改为特定的id
,而不会出现问题。
但是,如果我尝试在item
路线中启动我的应用(即/item/2
),deserialize
将返回undefined。我假设这是因为Application#ready
尚未完成填充控制器。
我该如何解决这个问题?
修改:我认为this回答了我的问题。使用ember-data。
异步
最后一点:如果应用尚未加载Post 1>您可能会问自己该系统如何工作?当
App.Post.find(1)
被调用时。这样做的原因是
ember-data
总是立即返回一个对象,即使它需要启动一个查询。该对象以空data
哈希开始。当服务器返回数据时,ember-data更新对象的data
,它还会触发所有已定义属性(使用DS.attr
定义的属性)的绑定。
答案 0 :(得分:4)
我不知道如何纠正您的初始化问题,但如果您不想,则绝对不必使用ember-data
。
Personnaly,我有:
deserialize
,Ember.Route
方法
App.ModelFetcher
类:
find(id, doneRequestCallback, failRequestCallback)
all(doneRequestCallback, failRequestCallback)
App.ModelFetcher.find(id, function() {}, function() {})
deserialize
这两个方法,如ember-data
所做的那样,分别返回一个空的App.Model
对象和一个空数组。请求完成后,这些对象会被请求值夸大。
可能有更好的解决方案,但它对我来说效果很好,看起来并不那么糟糕。
您也可以,而不是覆盖deserialize
方法,只需定义经典App.Model.find(id)
函数(返回空App.Model
实例),然后将状态设置为您的对象,像ember-data
一样(见http://goo.gl/3otkt)。
如果动态细分的格式为model_id
,则该方法将由ember自动调用(参见http://goo.gl/y86KE)。
无论如何,我可能错了,但我不喜欢你试图在控制器中获取对象的事实,但我没有其他解决方案,而不是上面描述的那些。