导航到记录工作,但深层链接抛出错误?

时间:2013-08-28 12:17:24

标签: ember.js

我有一个简单的EmberJS应用程序,有2个简单模型(ember-model)。帐户和项目,而帐户包含多个项目。

因此,当我使用应用程序中的链接导航到#/ accounts / 1 / items时,它可以正常工作。但是,当我直接重新加载#/ accounts / 1 / items时,我收到错误:

Assertion failed: The value that #each loops over must be an Array. You passed <App.Account:ember335> (wrapped in (generated items controller)) ember.js?body=1:382
Uncaught TypeError: Object [object Object] has no method 'addArrayObserver' ember.js?body=1:19476
Assertion failed: Emptying a view in the inBuffer state is not allowed and should not happen under normal circumstances. Most likely there is a bug in your application. This may be due to excessive property change notifications. ember.js?body=1:382

这就是我的应用程序的样子:

App.Router.map ()->
  @resource 'accounts', ->
    @resource 'account', path: ':account_id', ->
      @resource 'items'

App.AccountRoute = Ember.Route.extend
  model: (params) ->
    App.Account.find(params.account_id)

App.ItemsRoute = Ember.Route.extend
  model: ->
    @.modelFor('account').get('items')

App.Account = Ember.Model.extend
  name: Ember.attr('string')
  item_ids: Ember.attr(),
  items: (->
    App.Items.find(@.get('comment_ids'))
  ).property('comment_ids')

App.Item = Ember.Model.extend
  name: Ember.attr('string')

控制器是标准的(空)。

在JS控制台中,这样的调用工作正常并返回正确的结果,即使在抛出错误(并且没有渲染)之后:

 App.Account.find(1).get('items')

我不知道为什么会发生这种情况并且代码看起来如此直接以至于它真的很烦人,没有线索。有人有想法吗?

1 个答案:

答案 0 :(得分:0)

我不是余烬数据专家,但似乎它正在回复一个承诺。因此你应该尝试:

App.ItemsRoute = Ember.Route.extend({
  model : function(){
    var accountPromise = App.Account.find(1);
    var itemsPromise = Ember.Deferred.create();
    accountPromise.then(function(account){
      itemsPromise.resolve(account.get("items"));
    });
    return itemsPromise;
  }
});

为什么必须如此?

  1. App.Account.find(1);执行异步调用,因此返回一个promise。
  2. 这就是为什么你不能立即退货,你必须等待accountPromise完成。
  3. 您将返回一个新的承诺(itemspromise),该承诺将在accountPromise完成后得到满足。
  4. 因为您返回Promise,Ember会等待它完成并将结果用作Controller的模型。
  5. PS:实际上这对我来说似乎有点复杂。我认为这会有效,但可能会有更优雅的解决方案。