ContainerView没有正确连接子视图和控制器

时间:2012-10-22 11:11:05

标签: ember.js

我在下面定义了一个容器视图

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没有正确连接View和Controller?

1 个答案:

答案 0 :(得分: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的控制器,。