0

ネストされたリソースを実行するためにホットなものをテストするための小さな EmberJS アプリがあります。親ルート/コントローラーデータへのアクセスが機能する場合もあれば、そうでない場合もあります。これはおそらく、EmberJS がその魔法をどのように実行するかについての私の見落としによるものです。

アプリは次のとおりです。

window.App = Ember.Application.create();

  App.Router.map(function() {
    this.resource('items', function() {
      this.resource('item', {path: ':item_id'}, function() {
        this.resource('subitems');
      });
    });
  });

  App.ApplicationController = Ember.Controller.extend({
    model: {
      items: [
        {
          id: 1,
          name: 'One',
          subitems: [
            {
              id: 1,
              name: 'One One'
            }, {
              id: 2,
              name: 'One Two'
            }
          ]
        }, {
          id: 2,
          name: 'Two',
          subitems: [
            {
              id: 3,
              name: 'Two One'
            }, {
              id: 4,
              name: 'Two Two'
            }
          ]
        }
      ]
    }
  });

  App.ItemsRoute = Ember.Route.extend({
    model: function() {
      return this.controllerFor('Application').get('model.items')
    }
  });

  App.ItemRoute = Ember.Route.extend({
    model: function(params) {
      var items = this.controllerFor('Items').get('model')
      var item  = items.filterBy('id', parseInt(params.item_id))[0]
      return item
    }
  });

  App.SubitemsRoute = Ember.Route.extend({
    model: function(params) {
      var item = this.controllerFor('Item').get('model')
      var subitems = item.get('subitems')
      return subitems
    }
  });

http://jsfiddle.net/maxigs/cCawE/

ここに私の質問があります:

items/1/subitems に移動すると、エラーがスローされます。

Error while loading route: TypeError {} ember.js:382
Uncaught TypeError: Cannot call method 'get' of undefined test:67

どうやら ItemController がそのデータを正しくロードし (表示され)、同じ構造が ItemsRoute に対しても機能してデータを取得するため、実際にはわかりません。

親のルート パラメータ (item_id) にアクセスできないため、ApplicationController からデータに直接アクセスしても問題なく動作しますが、データを再取得する方法は他にありません。

ルートではなくコントローラーでルート データを定義する必要があるのはなぜですか?

モデル定義を ApplicationController から ApplicationRoute に移動しても機能しません。概念的には、私が理解している限り、これは正しい方法である必要があります。他の場所では、ルート内のコントローラーのモードデータを定義しているためです。

それとも、コントローラーのニーズ API を介して全体をより適切に実行する必要がありますか? 私が理解している限りでは、コントローラー (またはそのビュー) 内の余分なデータにアクセスすることだけが必要ですが、ルーターの仕事はモデルを提供することです。

4

2 に答える 2

0

1. items/1/subitems に移動すると、エラーがスローされます。

モデルは単なる JavaScript オブジェクトであるため、データを取得するメソッドはありません。item.subitems を実行するだけでサブアイテムにアクセスできます。

また、controllerFor() の引数は小文字にする必要があります。

例えば:

this.controllerFor('application')

2.ルートデータをルートではなくコントローラーに定義する必要があるのはなぜですか?

setupControllerメソッドのルートからモデルを設定できます。

App.ApplicationRoute = Ember.Route.extend({
  setupController: function(controller) {
    controller.set('model', { ... });
  }
});

http://jsfiddle.net/Y9kZP/

于 2013-08-30T16:12:16.833 に答える