我有一个由路线和相关控制器设置的视图。
我可以跟踪创建控制器但是在init()
函数中
查看,当我这样做时:
init: function() {
this._super();
console.log(this.get('controller'));
}
控制器为null
。
如果我签入didInsertElement()
,则控制器已设置。
我认为将控制器放在init()
函数中会很有用。
为什么不是这样?
答案 0 :(得分:2)
就是这种情况,因为在创建View时会调用 init()(= Ember对象)。某处Ember做了类似下面的事情。然后你的init被调用。
var view = Ember.View.create({});
此时未分配控制器。稍后会分配控制器。大多数情况下,这是你的路线。从路由的渲染代码中查看此代码:
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进行设置。所以'controller'属性并不总是设置好的!
你应该怎么做? 您没有详细说明您的要求,但使用willInsertElement()挂钩应该没问题。这是在元素在DOM之前。这应该足够早才能访问它,对吗?