2013-01-24 54 views
10

我的理解的是,当我运行访问的控制器的一个实例或在烬视图

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

CheeseController被创建并且当我激活奶酪路由类的一个实例是由这在我的把手模板中与控制器交谈时我实际触摸到的内容。

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

+7

使用烬主(PRE4),并仅用于调试** **的目的,你可以通过以下方式访问控制器:'App .__ container __。lookup('controller:cheese')'。它也适用于'route:theRoute'。 – louiscoquio

回答

20

创建一个类CheeseController而当我激活奶酪路由类的一个实例是由这是谈论我的车把模板控制器,当我真正接触。

是的,这正是发生了什么。 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']可以通过其他控制器通过controllers.cheese属性访问该单身人员App.CheeseController。见Automatically synthesize the controller 'needs' dependencies
  • 从模板:使用needs阵列从模板控制器声明的依赖,然后从你的模板内的奶酪控制器是:{{controllers.cheese}}

也可以通过访问cheeseController实例烬容器,但请不要。该容器不是一个公共API。最近对Ember的更新使得访问有些尴尬。这是因为使用全局常量来访问实例会破坏封装,虽然这对控制台来说很好,但应该避免在应用程序代码中使用。有关更多细节,请参阅App.container was not meant to be a public API

更一般地说,Ember自动生成的对象在哪里? 内部烬将容器中的控制器单例缓存。当然,它不是公共API的一部分,但如果您想了解如何工作的事情在内部检查container_test.jsWhat is the purpose of the Ember.Container

+0

如果我只想在正在运行的应用程序上使用控制台,而不是在模板中间停止执行,该怎么办? –

+5

在这种情况下,您可以通过容器访问控制器实例,例如'App .__ container __。lookup(“controller:posts”)'。请参阅http://emberjs.com/guides/understanding-ember/debugging/#toc_view-ember-data-s-identity-map –

相关问题