使用serialize / deserialize ember.js进行初始化

时间:2012-08-22 00:10:21

标签: routing ember.js

我正在使用没有余烬数据的新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定义的属性)的绑定。

1 个答案:

答案 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)。

无论如何,我可能错了,但我不喜欢你试图在控制器中获取对象的事实,但我没有其他解决方案,而不是上面描述的那些。