在视图中获取控制器

时间:2013-02-01 02:45:14

标签: ember.js

我使用最新的emberjs 1.0 pre4。

在App.FormController中,我将childView插入到containerView:

containerView.get('childViews').pushObject(
    App.FieldData4MultipleChoiceView.create()
);

在这个childView中,我尝试打印“me.get('controller')”:

didInsertElement: function() {
    var me = this;
    $(".fieldset.group").on("click", ".fieldChoice img", function(e){
        var controller = me.get('controller');
        console.log(controller); // line A
    });
}

问题1: 为什么“line A”返回App.ApplicationController类的实例但不返回App.FormController?

问题2: 如何在任何其他视图中获取App.FormController的单个实例(不仅仅是App.FormController下的视图)?

非常感谢!

2 个答案:

答案 0 :(得分:1)

  

问题1:为什么“line A”返回App.ApplicationController类的实例而不是App.FormController?

你的例子说“在App.FormController中,我将一个childView插入到一个容器视图中”但是不清楚该容器是如何存在的,或者它的上下文是什么。那个childView将继承它的父元素的上下文,所以我的猜测是containerView本身没有App.FormController作为它的控制器。

  

问题2:如何在任何其他视图中获取App.FormController的单个实例(而不仅仅是App.FormController下的视图)?

你不能,至少不能没有真正破解ember的内部API。这是设计的。每个视图都应该非常轻量级,并且只依赖于它的相应控制器。该控制器可以绑定到App.FormController或其中一个属性,但视图不需要知道。

答案 1 :(得分:0)

  

问题1:为什么“A行”会返回一个实例   App.ApplicationController类但不是App.FormController?

我不太明白为什么没有将上下文传递给视图,但是您可以在实例化视图时通过传递它来自己指定控制器:

App.FieldData4MultipleChoiceView.create({ controller: this.get('formController'); });
  

问题2:我怎样才能获得任何App.FormController的单个实例   其他视图(不只是App.FormController下的视图)?

如果您按照自己的方式进行操作,则需要通过控制器。您可以在自动把手中使用{{render "my"}},这会自动附加MyViewMyController。但是,如果您不这样做,那么您可以使用setupController传递控制器:

var MyRoute = Ember.Route.extend({
    setupController: function(controller) {
        controller.set('formController', this.controllerFor('form'));
    }
});

现在,您可以从this.get('formController')实例中访问MyController

在EMBER 1.0.0-PRE.5中,我们不再有this.controllerFor,而是使用needs来指定任何给定控制器中所需的控制器。