10

我的理解是,当我跑步时

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

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

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

4

1 回答 1

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.CheeseControllercontrollers.cheese
  • 从模板:使用needs数组声明模板控制器的依赖关系,然后在模板中,奶酪控制器位于:{{controllers.cheese}}

It is also possible to access the cheeseController instance via the ember container, but please don't. The container is not meant to be a public API. Recent updates to Ember have made accessing it somewhat awkward. This is because using global constants to access instances breaks encapsulation, and while that is fine for the console it should be avoided in your application code. For more detail, see App.container was not meant to be a public API

More generally, where do the objects that Ember automatically makes live? Internally ember caches controller singletons in the container. Of course it is not a part of the public API, but if you are curious about how things work internally check out container_test.js and What is the purpose of the Ember.Container

于 2013-01-24T17:26:12.197 回答