之所以如此,是因为在创建视图(= Ember 对象)时会调用 init()。 Ember 在某处做了类似于以下的事情。然后你的 init 被调用。
var view = Ember.View.create({});
此时未分配控制器。稍后分配控制器。大多数时候,这是在你的路线上。从 Routes 的渲染代码中查看这段代码:
function setupView(view, container, options) {
var defaultView = options.into ? 'view:default' : 'view:toplevel';
view = view || container.lookup(defaultView); // the view gets created here and init gets called
if (!get(view, 'templateName')) {
set(view, 'template', options.template);
set(view, '_debugTemplateName', options.name);
}
set(view, 'renderedName', options.name);
set(view, 'controller', options.controller); // controller gets assigned to view
return view;
}
如您所见,首先将视图实例化,然后将控制器分配给它。
为什么 Ember 会这样做?是不是错了?
您目前的理解是,始终有一个控制器与您的视图相连。但情况并非总是如此。以 {{view}} 帮助器为例。通常你用一个 contextBinding 来设置它。所以“控制器”属性并不总是设置!
你应该怎么做?
您没有详细概述您的要求,但使用 willInsertElement() 钩子应该没问题。这是在元素位于 DOM 之前。那应该够早了,对吧?