0

ember rc1,ember-data rev 12。我所有其他路由都正确加载,不确定为什么我会看到这个错误。当我尝试访问显示路线即 /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 失败 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

4

1 回答 1

5

该模型返回一条记录。但是,您已经定义了一个ArrayController.

Ember.js 会自动将模型放在控制器的 content 属性中,这将导致错误,因为它会将单个记录放入数组控制器中。

即使你覆盖了setupController, 在它触发之前,Ember.js 还是会将模型放置在控制器中。目前没有办法阻止这种情况。


2014 年 6 月 3 日更新(Ember > 1.0):

如果您现在覆盖setupControllerEmber,则不再设置该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}}.

最需要注意的是:如果你的控制器是一个对象控制器,你必须从模型钩子返回一个对象,如果你的控制器是一个数组控制器,那么你必须从模型钩子返回一个数组。

好的一面是,这会促使你遵循我和核心团队认为更好的某种设计。

于 2013-03-27T09:56:03.903 回答