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

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 的控制器在第一种情况下是 Application:

直接使用 NavView 类作为 mainView 的子项,不会自动将 NavController 绑定到它。因此,当您尝试获取它的控制器时,它会回退到其 parentView 的控制器。

于 2012-10-23T07:50:17.937 回答