2

以下で定義されたコンテナビューがあります

app.MainView = Ember.ContainerView.extend({
    childViews: ['navigationView', 'gutterView', 'mainView'],
    elementId: 'master',
    navigationView: app.NavView,
    gutterView: app.GutterView,
    mainView: Ember.View.create({
        elementId: 'content',
        template: Ember.Handlebars.compile('{{outlet contentOutlet}}')
    })
});
app.NavView = Ember.View.extend({
    elementId: 'main-menu',
    classNames: ['navigationPanel'],
    template: Ember.Handlebars.compile('{{controller}}')
});
app.NavController = Ember.ArrayController.extend({
    content: [],
});

ここでの問題は、このように定義すると、app.NavView (app.NavController) のコントローラーがビューに接続されないことです。テンプレートから NavView の {{controller}} を見ると、ApplicationController が表示されます。

しかし、私がそれを次のように定義すると:

 app.MainView = Ember.ContainerView.extend({
    childViews: ['navigationView', 'gutterView', 'mainView'],
    elementId: 'master',
    navigationView: Ember.View.extend({
        elementId: 'nav',
        template: Ember.Handlebars.compile('{{outlet navOutlet}}')
    }),
    gutterView: app.GutterView,
    mainView: Ember.View.create({
        elementId: 'content',
        template: Ember.Handlebars.compile('{{outlet contentOutlet}}')
    })
});

ルーターのconnectOutletを介してNavViewを接続します

router.get('applicationController').connectOutlet('navOutlet', 'nav');

NavView で接続されているコントローラーは NavController であることがわかりました。これは正しいです。

問題は、ここで何が欠けているかです。ここにアウトレットは必要なく、mainView を通じて作成したいと考えています。ContainerView を使用すると、Ember がビューとコントローラーを正しく接続しないのはなぜですか?

4

1 に答える 1

1

ビューとコントローラーの間の「接続」は、あなたが信じていたほど「自動魔法」ではありません。への呼び出しを介して行われるアウトレットを使用する

router.get('applicationController').connectOutlet('aOutlet', 'nav');

https://github.com/emberjs/ember.js/blob/master/packages/ember-views/lib/system/controller.js#L102のコードを見ていくと、名前付けによってコントローラーを取得していることがわかります規則を作成し、作成したばかりのビューをそれに接続します。

ここでアウトレットを使用したくない場合は、コントローラーを手動でビューに渡すことをお勧めします。

編集:最初のケースで NavView のコントローラーがアプリケーションである理由を正確にするには:

NavView クラスを mainView の子として直接使用すると、NavController がそれに自動的にバインドされません。そのため、コントローラーを取得しようとすると、parentView のコントローラーにフォールバックします。

于 2012-10-23T07:50:17.937 に答える