Доступ к экземпляру контроллера или представлению в ember

Я понимаю, что когда я запускаю

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

Создается класс CheeseController и что когда я активирую маршрут Cheese, создается экземпляр этого класса, который я на самом деле затрагиваю при разговоре с контроллером в моем шаблоне handlebars.

Можно ли напрямую получить доступ к этому экземпляру объекта из консоли javascript (или из моей программы)? В более общем плане, где объекты, которые Ember автоматически делает вживую?

Ответ 1

Создается класс CheeseController, и когда я активирую маршрут Cheese, создается экземпляр этого класса, который я фактически затрагиваю при разговоре с контроллером в моем шаблоне handlebars.

Да, это именно то, что происходит. Ember создает одиночный экземпляр App.CheeseController и предоставляет его в качестве контекста при рендеринге вашего шаблона handlebars.

Возможно ли получить прямой доступ к этому экземпляру объекта из консоли javascript.

Да. Лучший способ сделать это с помощью javascript-консоли - использовать хелпер handlebars {{debugger}} из вашего шаблона. Это откроет консоль отладки JS в контексте вашего шаблона.

<script type="text/x-handlebars" data-template-name="cheese">
  {{debugger}}
</script>

Если отладчик открыт, вы можете получить доступ к инстанцированному синглтону контроллера как this, поэтому this.toString() должен возвращать что-то вроде <App.CheeseController:ember225>.

(или из моей программы)?

Зависит от какой части вашей программы

  • От маршрута: используйте this.controllerFor('cheese')
  • Из модели: Нет. Пожалуйста, не обращайтесь к контроллерам с моделей.
  • От другого контроллера: если вы заявляете зависимость в другом контроллере, needs: ['cheese'], то singleton App.CheeseController будет доступен из другого контроллера через свойство controllers.cheese. См. Автоматически синтезировать зависимости "потребности" контроллера
  • Из шаблона: используйте массив needs, чтобы объявить зависимость от контроллера шаблонов, затем из вашего шаблона контроллер сыра находится по адресу: {{controllers.cheese}}

Также возможен доступ к экземпляру cheeseController через контейнер ember, но, пожалуйста, не делайте этого. Контейнер не должен быть общедоступным API. Недавние обновления для Ember сделали доступ к нему несколько неудобным. Это связано с тем, что использование глобальных констант для доступа к экземплярам прерывает инкапсуляцию, и в то время как это хорошо для консоли, этого следует избегать в коде приложения. Более подробно см. App.container не должен был публичным API

В более общем плане, где объекты, которые Ember автоматически делает вживую? Внутри ember кешируют контроллеры в контейнере. Конечно, это не часть публичного API, но если вам интересно, как все работает внутри, проверьте container_test.js и Какова цель Ember.Container