2013-03-07 103 views
2

我有一个视图,它由一个路由加上一个关联的控制器设置。 我可以跟踪控制器创建的,但在 鉴于init()功能,当我这样做:无法在初始化函数1.0.0rc中查看初始化函数

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

控制器是null。 如果我登记didInsertElement(),控制器已设置。 我认为让init()函数中的控制器已经很有用。 为什么不是这样?

+0

yes..you无法初始化得到()函数 – thecodejack 2013-03-07 13:37:14

回答

2

这种情况,因为当视图被创建(= Ember对象)时init()被调用。某处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来设置它。所以'控制器'属性并不总是设置!

你应该怎么做你的情况? 您没有详细说明您的要求,但您应该没问题使用willInsertElement()挂钩。这是元素在DOM之前。这应该是足够早的访问它,对吧?

+0

我的实际问题是相当艰难的,我张贴在这里现在: http://stackoverflow.com/questions/15275955/realize-a-dynamic-master-细节情景中 - 视图 - 在-余烬-1-0-0rc – vanthome 2013-03-07 16:09:07