2

我正在使用Router没有 ember-data 的新版本,所以我必须为动态 url 段实现我自己的serialize/ deserialize

我有一个ArrayController填充了Application#ready.

为简单起见,假设我有 2 条路线:item > '/item/:item_id'& items > '/items'

item路线中的反序列化方法看起来像这样

 deserialze: function(router, params){ 
     return router.get('myController')
                  .findProperty('id', params['item_id']);
 }

如果我在路线上初始化我的应用程序并通过一切正常items导航到item特定项目的路线。{{action}}此外,在此之后,我可以手动将 url 更改为特定id的,而不会出现问题。

但是,如果我尝试在item路线(即/item/2)中启动我的应用程序,则deserialize返回未定义。我假设这是因为Application#ready尚未完成填充控制器。

我该如何解决这个问题?

编辑:我认为回答了我的问题。使用 ember 数据。

异步

最后一点:您可能会问自己,如果应用程序在调用时尚未加载 Post 1 >,该系统将如何工作App.Post.find(1)

这样做的原因是它ember-data总是立即返回一个对象,即使它需要启动一个查询。该对象以空data哈希开始。当服务器返回数据时,ember-data 会更新对象的data,这也会触发对所有已定义属性(使用 定义的属性DS.attr)的绑定。

4

1 回答 1

4

ember-data我不知道如何纠正您的初始化问题,但如果您不想使用,您绝对不必使用。

就个人而言,我有:

  • 覆盖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如果动态段具有格式(参见http://goo.gl/y86KE),则 ember 将自动调用该方法。

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

于 2012-08-22T10:40:42.890 回答