我的理解是,当我跑
时App.CheeseController = Ember.Controller.extend({ type:"brie"});
创建了一个类 CheeseController
,当我激活Cheese路由时,会生成该类的一个实例,这是我在我的车把模板中与控制器交谈时实际触摸的内容。
是否可以从javascript控制台(或从我的程序中)直接访问该实例化对象?更一般地说,Ember自动生成的物体在哪里?
答案 0 :(得分:20)
创建了一个类CheeseController,当我激活Cheese路由时,会创建该类的一个实例,这是我在手柄模板中与控制器交谈时实际触摸的内容。
是的,这正是发生的事情。 Ember创建App.CheeseController的单例实例,并在渲染手柄模板时将其作为上下文提供。
是否可以从javascript控制台中直接访问该实例化对象
是。从javascript控制台执行此操作的最佳方法是使用模板中的把手{{debugger}}
帮助程序。这将在模板的上下文中打开JS调试控制台。
<script type="text/x-handlebars" data-template-name="cheese">
{{debugger}}
</script>
打开调试器后,您可以将实例化的控制器单例访问为this
,因此this.toString()
应返回<App.CheeseController:ember225>
之类的内容。
(或从我的程序中)?
取决于您的计划的哪个部分
this.controllerFor('cheese')
needs: ['cheese']
中声明了一个依赖项,则可以通过属性App.CheeseController
从另一个控制器访问单个controllers.cheese
。请参阅Automatically synthesize the controller 'needs' dependencies needs
数组从模板控制器声明依赖关系,然后从模板中的控制器位于:{{controllers.cheese}}
也可以通过ember容器访问cheeseController实例,但请不要。容器不是公共API。最近对Ember的更新使得访问它有点尴尬。这是因为使用全局常量来访问实例会破坏封装,虽然这对于控制台来说很好,但应该在应用程序代码中避免使用它。有关更多详细信息,请参阅App.container was not meant to be a public API
更一般地说,Ember自动生成的对象在哪里? 内部ember缓存容器中的控制器单例。当然,它不是公共API的一部分,但如果您对内部工作原理感到好奇,请查看container_test.js和 What is the purpose of the Ember.Container