【问题标题】:Cannot access Controller in init function of View in 1.0.0rc在 1.0.0rc 的 View 的 init 函数中无法访问 Controller
【发布时间】:2013-03-07 13:20:43
【问题描述】:

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

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

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

【问题讨论】:

  • 是的..你不能进入 init() 函数

标签: ember.js


【解决方案1】:

之所以如此,是因为在创建视图(= 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 之前。那应该够早了,对吧?

【讨论】:

猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多