Ответ 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']
, то singletonApp.CheeseController
будет доступен из другого контроллера через свойствоcontrollers.cheese
. См. Автоматически синтезировать зависимости "потребности" контроллера - Из шаблона: используйте массив
needs
, чтобы объявить зависимость от контроллера шаблонов, затем из вашего шаблона контроллер сыра находится по адресу:{{controllers.cheese}}
Также возможен доступ к экземпляру cheeseController через контейнер ember, но, пожалуйста, не делайте этого. Контейнер не должен быть общедоступным API. Недавние обновления для Ember сделали доступ к нему несколько неудобным. Это связано с тем, что использование глобальных констант для доступа к экземплярам прерывает инкапсуляцию, и в то время как это хорошо для консоли, этого следует избегать в коде приложения. Более подробно см. App.container не должен был публичным API
В более общем плане, где объекты, которые Ember автоматически делает вживую? Внутри ember кешируют контроллеры в контейнере. Конечно, это не часть публичного API, но если вам интересно, как все работает внутри, проверьте container_test.js и Какова цель Ember.Container