1

本次提交的注释中,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() 

在这种情况下,一切都会好起来的。

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

4

1 回答 1

1

我不知道你是否还在寻找答案。我也在为如何“以 Ember 方式”做事而苦苦挣扎。

这个答案让我走上了正确的轨道,应该与你的问题相关: “请确保这个控制器是用容器实例化的”

至于我,我遇到了与上述问题相同的问题:当我手动实例化我App.AnyOtherController的 with 时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/

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

于 2015-03-25T04:53:56.630 回答