2

I have a view which is setup by a route plus an associated controller. I can trace that the controller is created but in the init() function of the view, when I do this:

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

The controller is null. If I check in didInsertElement(), the controller is set. I think it would be useful to have the controller in the init() function already. Why is this not the case?

4

1 回答 1

2

情况就是这样,因为init() 在创建视图时被调用(= Ember 对象)。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 之前。那应该足够早访问它,对吧?

于 2013-03-07T14:31:26.107 回答