为什么我看到“加载路线时出错”与ember?

时间:2013-03-26 21:07:42

标签: ember.js ember-data

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

1 个答案:

答案 0 :(得分:5)

模型返回单个记录。但是,您已定义ArrayController

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

即使你在setupController之前覆盖它,在它发射之前,Ember.js仍会将模型放在控制器中。目前无法阻止这种情况。


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

如果您现在覆盖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 从模型钩子返回一个数组。

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