我在下面定义了一个容器视图
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?
答案 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的控制器,。