ember rc1,ember-data rev 12.所有其他路由正确加载,不确定为什么我看到这个错误。当我尝试访问show route即/ files / groups / 5时会发生这种情况。索引路线呈现良好。
我已经粘贴了下面的堆栈跟踪,但它的信息量不大。我在这里做了什么基本上错了?
我的路线/控制器设置如下:
this.resource('files', { path : '/files' }, function() {
this.resource('groups', { path : '/groups' }, function() {
this.route('show', { path : '/:asset_link_group_id' });
});
});
AssetLinksApp.GroupsShowController = Ember.ArrayController.extend({
content : Ember.A(),
assetLinkGroup : null
});
AssetLinksApp.GroupsShowRoute = AssetLinksApp.AuthRequiredRoute.extend({
setupController : function(controller,model) {
controller.set('content',model.get('asset_links'));
controller.set('assetLinkGroup',model);
},
model : function(params) {
return AssetLinksApp.AssetLinkGroup.find(params.asset_link_group_id);
}
});
堆栈跟踪:
加载路线时出错:TypeError {} exchange_vendor.js:12078
(匿名函数)exchange_vendor.js:12078 Ember.Router.reopenClass.defaultFailureHandler.setup exchange_vendor.js:35011 failure exchange_vendor.js:34448 objects.concat.context exchange_vendor.js:34497 invokeCallback exchange_vendor.js:17846 Promise.then exchange_vendor.js:17893 EventTarget.trigger exchange_vendor.js:17822结果 exchange_vendor.js:17924 RunLoop._prev exchange_vendor.js:15911 Ember.handleErrors exchange_vendor.js:12140调用 exchange_vendor.js:15909 iter exchange_vendor.js:15981 RunLoop.flush exchange_vendor.js:16035 RunLoop.end exchange_vendor.js:15940 tryable exchange_vendor.js:16143 Ember.tryFinally exchange_vendor.js:12831 Ember.run.end exchange_vendor.js:16146 Ember.tryFinally exchange_vendor.js:12833 Ember.run exchange_vendor.js:16102 Ember.HashLocation.Ember.Object.extend.onUpdateURL exchange_vendor.js:36690 jQuery.event.dispatch exchange_vendor.js:3144 jQuery.event.add.elemData.handle.eventHandle
答案 0 :(得分:5)
模型返回单个记录。但是,您已定义ArrayController
。
Ember.js会自动将模型放在控制器的内容属性中,这会导致错误,因为它会将单个记录放在数组控制器中。
即使你在setupController
之前覆盖它,在它发射之前,Ember.js仍会将模型放在控制器中。目前无法阻止这种情况。
如果您现在覆盖setupController
,则Ember不再设置model
属性。
我能想到的唯一解决方案是为您的路线添加资源:
this.resource('files', { path : '/files' }, function() {
this.resource('groups', { path : '/groups' }, function() {
this.resource('group', { path : '/:asset_link_group_id' }, function() {
this.route('index');
});
});
});
这意味着你有一个包含该组的对象控制器(GroupController
),
和包含资产链接数组的数组控制器(GroupIndexController
)。
AssetLinksApp.GroupIndexController = Ember.ArrayController.extend({
assetLinkGroup : null
});
AssetLinksApp.GroupIndexRoute = AssetLinksApp.AuthRequiredRoute.extend({
setupController : function(controller,model) {
controller.set('content',model);
controller.set('assetLinkGroup', this.modelFor('group'));
},
model : function(params) {
return this.modelFor('group').get('asset_links');
}
});
现在,您的模板应命名为group/index
,而不是groups/show
。对于group
模板,它可以是包含{{outlet}}
的空模板。
最值得注意的是:如果你的控制器是一个对象控制器,你有从模型钩子返回一个对象,如果你的控制器是一个阵列控制器,那么你< strong> has 从模型钩子返回一个数组。
光明的一面是,这促使你遵循我和核心团队认为更好的某种设计。