无法访问1.0.0rc中View的init函数中的Controller

时间:2013-03-07 13:20:43

标签: ember.js

我有一个由路线和相关控制器设置的视图。 我可以跟踪创建控制器但是在init()函数中 查看,当我这样做时:

init: function() {                  
  this._super();                     
  console.log(this.get('controller'));
}

控制器为null。 如果我签入didInsertElement(),则控制器已设置。 我认为将控制器放在init()函数中会很有用。 为什么不是这样?

1 个答案:

答案 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之前。这应该足够早才能访问它,对吗?