在ember中访问控制器或视图的实例

时间:2013-01-24 16:38:06

标签: javascript ember.js handlebars.js ember-router

我的理解是,当我跑

App.CheeseController = Ember.Controller.extend({ type:"brie"});

创建了一个类 CheeseController ,当我激活Cheese路由时,会生成该类的一个实例,这是我在我的车把模板中与控制器交谈时实际触摸的内容。

是否可以从javascript控制台(或从我的程序中)直接访问该实例化对象?更一般地说,Ember自动生成的物体在哪里?

1 个答案:

答案 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.jsWhat is the purpose of the Ember.Container