我有一个简单的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')
我不知道为什么会发生这种情况并且代码看起来如此直接以至于它真的很烦人,没有线索。有人有想法吗?
答案 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;
}
});
为什么必须如此?
App.Account.find(1);
执行异步调用,因此返回一个promise。itemspromise
),该承诺将在accountPromise完成后得到满足。PS:实际上这对我来说似乎有点复杂。我认为这会有效,但可能会有更优雅的解决方案。