4

ArrayController 定義で itemController を設定するためのEmberの例に従うと、ブロッキング エラー メッセージが表示されます。

TypeError: Cannot call method 'lookup' of null

JSFiddle: http://jsfiddle.net/jgilick/M4BVV/

// Addresses array controller
App.AddressesController = Ember.ArrayController.extend({
    itemController: 'address'
});

// Address object controller
App.AddressController = Ember.ObjectController.extend({
    city: function(){
        return "San Francisco";
    }.property()
});

これを修正するために私が見つけた唯一の方法は...

1) #each ハンドラー ( jsfiddle )で itemController を渡します。

{{#each addresses itemController="address"}}
    <li>{{line1}}, {{city}}</li>
{{/each}}

...また...

2) コンテナー プロパティを ArrayController ( jsfiddle )に追加します。

var addresses = App.AddressesController.create({
    container: indexController.get('container'),
    content: [
        App.Address.create({'line1': '700 Hansen Wy'}),
        App.Address.create({'line1': '900 Hansen Wy'})
    ]
});

これらのソリューションはどちらもハックで非常に間違っているように感じます。ArrayController 自体に itemController を設定すると何が間違っていますか?

4

4 に答える 4

6

コントローラからのitemControllerと各ビューは関係ありません。それは同じことをしますが、指定されたコントローラーでオブジェクトをラップします。

のインスタンスが nullであるCannot call method 'lookup' of nullため、最初の実装では がスローされます。他のコンテナでコントローラを作成すると、コンテナがセットアップされます。以下を使用する場合、これは抽象化されます。containerAddressesController

this.controllerFor('addresses')

それ以外の

 App.AddressesController.create ...

だから、この作品http://jsfiddle.net/marciojunior/GRaa5/

1) #each ハンドラで itemController を渡す

前に言ったように、itemControllerコントローラーと各ヘルパーには関係がありません。だからあなたは彼を混ぜることができます。

{{#each addresses itemController="address"}}
    <li>{{line1}}, {{city}}</li>
{{/each}}

これを実際に見てくださいhttp://jsfiddle.net/marciojunior/spA9Q/

2) コンテナー プロパティを ArrayController に追加します。

この作業は、私の以前の説明のために、

containerインスタンスAddressesControllerが nullであるため

@coymba の例を完成させるとうまくいきます。setupController の前に:

setupController: function(controller, model){
    controller.set('content', model);
}

を使用してそのフックにコントローラーを提供するcontrollerForと、生成されたコントローラーにもコンテナーが存在します。

于 2013-08-13T01:55:35.933 に答える
1

まず第一に、そのコードは私には少し奇妙に思えますが、とにかく、ルーターで「AddressesController」の新しいインスタンスを作成しているということです。これを次のように変更する必要があります。

App.IndexRoute = Ember.Route.extend({
  setupController: function(indexController) {
    this.controllerFor('addresses').set('content', [App.Address.create({'line1': '700 Hansen Wy'}), App.Address.create({'line1': '900 Hansen Wy'})]);
    indexController.set('addresses', this.controllerFor('addresses'));
  }
})
于 2013-08-12T19:33:27.357 に答える