Ember docs を見ると、コントローラーがルートに関連付けられている場合、これは自動的に発生するようです
これは正しいです。ルートに関連付けられたコントローラーは、必要に応じて ember によって自動的にインスタンス化されます。
しかし、ビューとモデルを結び付けるアドホック コントローラーが必要な場合はどうすればよいでしょうか。これは、私のページの任意のコンポーネントである可能性があります。コントローラーのインスタンス化は私に責任がありますか? ある種の controllerBinding 属性を使用する必要がありますか? モデルまたはビューで自動的にインスタンス化されますか?
自分で行う必要なしに、任意のコントローラーを ember によって自動的にインスタンス化するには、さまざまな方法があります。
例として、 という名前のルートに関連付けられていないコントローラーがあると仮定しましょうLonelyController
。
App.LonelyController = Ember.ArrayController.extend({
content: ['foo', 'bar', 'baz']
});
アプローチ1
ルートがあり、 にフックすると仮定しましょう。ここでこれsetupController
をリクエストしようとすると、ember がそれをインスタンス化します。LonelyController
this.controllerFor('lonely');
App.IndexRoute = Ember.Route.extend({
setupController: function(controller, model) {
this.controllerFor('lonely').get('content');
// the above line will retrive successfully
// your `LonelyController`'s `content` property
}
});
アプローチ 2
LonelyController
ember によって自動的にインスタンス化されるもう 1 つの方法はneeds
、別のコントローラーで API を使用して依存関係を定義することです。
App.IndexController = Ember.ObjectController.extend({
needs: 'lonely',
someAction: function() {
this.get('controllers.lonely').get('content');
// the above line will retrive successfully
// your `LonelyController`'s `content` property
}
});
API を使用すると、次のneeds
ようなこともできます。
App.IndexController = Ember.ObjectController.extend({
needs: 'lonely',
lonelysContentBinding: 'controllers.lonely.content',
someAction: function() {
this.get('lonelysContent');
// the above line will retrive successfully
// your `LonelyController`'s `content` property
}
});
上記の方法を組み合わせて自動的にインスタンス化する方法もいくつかありますがLonelyController
、これは今ではもっと明確になっているはずです。
最後のヒント: ember が内部で自動的に作成するものの手がかりを得るには、生成ログを有効にしてコンソールでこれを観察することもできます。これは非常に役立ちます。
var App = Ember.Application.create({
LOG_ACTIVE_GENERATION: true
});
それが役に立てば幸い。