在Ember.js中使用__container __ .lookupFactory的惯用法

时间:2013-11-12 15:33:44

标签: ember.js

this commit的笔记中,Ember团队非常清楚地表明App.__container__.lookup()不是获得控制者的方式。相反,我们应该使用needs属性。

我理解这背后的基本原理,以及访问单例控制器的惯用方法。

但是,在我的应用程序中,我有一些需要实例控制器的情况。在这种情况下,我使用App.__container__.lookupFactory()来获取原型,然后create()extend()

有没有更好的方法(不使用__container__

编辑:

以下是一个示例用例。

App.MyContainerView = Ember.ContainerView.extend

  ...

  addChildView: ->
    @get("content").pushObject(App.MyChildView.create(...))

以上示例将新视图推送到堆栈(允许动态创建视图)

但是,由于使用App.MyChildView.create()创建,这些视图(可能?)没有设置正确的容器(以及其他属性?)。在我们将Ember部分集成到现有应用程序的情况下尤其如此。

创建这些视图的方法是:

App.__container__.lookupFactory("view:my_child").create() 

在哪种情况下一切都会好的。

存在其他用例,用于在路由器上下文之外创建实例控制器..但想法是一样的。

1 个答案:

答案 0 :(得分:1)

我不知道你是否还在寻找答案。我也在努力学习如何做“Ember方式”。

这个答案让我走上正轨,应该与你的问题相关: "Please ensure this controller was instantiated with a container"

至于我,我遇到了与上述问题相同的问题:当我用App.AnyOtherController手动实例化我的App.AnyOtherController.create(...)时,在此控制器内部,我无法访问依赖注入(例如我提供给所有控制器和路由的会话对象。)

以这种方式实例化相同的控制器通过为控制器提供容器来解决问题: this.container.lookupFactory('controller:any_other').create(...)

您应该可以从任何视图访问this.container,我猜,任何控制器,只要他们已经获得了容器。

您可以Ember.String.decamelize('AnyOther')将CamelCase控制器名称转换为合适的字符串。

有关容器的更多信息:http://ember.zone/beginning-to-understand-the-ember-js-container/

如果它没有帮助,我仍然希望这可以帮助那里的人,因为这个容器的东西起初有点棘手......