0

我使用最新的 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:为什么“A 行”返回的是 App.ApplicationController 类的实例,而不是 App.FormController?

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

非常感谢!

4

2 回答 2

1

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

您的示例说“在 App.FormController 中,我将 childView 插入到 containerView”,但尚不清楚该 containerView 是如何存在的或其上下文是什么。该 childView 将继承其父级的上下文,所以我的猜测是 containerView 本身没有App.FormController作为它的控制器。

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

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

于 2013-02-01T04:26:18.893 回答
0

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

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

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

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

如果您按照自己的方式进行操作,则需要通过控制器。您可以{{render "my"}}在 Handlebars 中使用,它会自动附加MyViewMyController. 但是,如果您不这样做,那么您可以将控制器传递给 using 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来指定任何给定控制器中所需的控制器。

于 2013-02-01T13:49:23.427 回答