在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()
在哪种情况下一切都会好的。
存在其他用例,用于在路由器上下文之外创建实例控制器..但想法是一样的。
答案 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/
如果它没有帮助你,我仍然希望这可以帮助那里的人,因为这个容器的东西起初有点棘手......