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:17846Promise.thenexchange_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 invoke exchange_vendor.js:15909 iter exchange_vendor.js:15981RunLoop.flushexchange_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: 16102Ember.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はモデルをコントローラーに配置します。現在、それを止める方法はありません。


アップデート3-2014年6月(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}}

これから注意する最も重要なことは、コントローラーがオブジェクトコントローラーの場合モデルフックからオブジェクトを返す必要があり、コントローラーがアレイコントローラーの場合はモデルフックから配列を返す必要あるということです。

明るい面は、これは私とおそらくコアチームがより良いと思う特定のデザインに従うようにあなたを促します。

于 2013-03-27T09:56:03.903 に答える