Ember.js получает доступ и организует контроллеры с новым маршрутизатором

Я пытаюсь понять контроллеры в новой системе маршрутизатора. Я понимаю, что они существуют для украшения моделей и представления непостоянного состояния в представлении/шаблоне для рендеринга. И я понимаю соглашения, которые маршрутизатор Ember использует для создания и настройки отдельных копий каждого контроллера из имен маршрутов. Но значит ли это, что у вас никогда не должно быть более одной копии контроллера?

Вот мой вариант использования: у меня есть набор вложенных списков элементов со сложным непостоянным состоянием для каждого элемента (разные уровни свернутой/видимой вложенности, разные режимы редактирования и т. д.). Я не думаю, что это относится к представлению, и слишком сложно (из-за вложенности) хранить в одноэлементном контроллере, поэтому я планировал иметь один экземпляр контроллера на один экземпляр представления (все тот же контроллер и класс представления, хотя ). Это звук?

Второй, более простой вопрос. Как мне получить доступ к контроллерам, которые создает маршрутизатор Ember? Раньше можно было сделать App.get('router.postController'), но это больше не работает.


person Sherwin Yu    schedule 11.04.2013    source источник


Ответы (1)


Первый вопрос

Не все контроллеры являются синглтонами. Бывают случаи, когда Ember.js создает для вас неодноэлементные контроллеры.

Один случай — использование itemController с помощником {{each}}:

{{#each model itemController="post"}}
  <!-- template here -->
{{/each}}

Это создаст новый экземпляр App.PostController для каждого post элемента в цикле.

Еще один случай, когда вы используете хелпер {{render}} и передаете ему модель:

{{render "post" firstPost}}
{{render "post" secondPost}}

Это создаст отдельный экземпляр App.PostController для каждого {{render}}.

Второй вопрос

Это зависит от того, откуда вы хотите получить к ним доступ.

С маршрута:

this.controllerFor("post");

С другого контроллера:

App.CommentController = Ember.ObjectController.extend({
  needs: ['post'],
  test: function() {
    return this.get('controllers.post');  // this returns the post controller
  }
});

Подробнее об этом здесь: http://emberjs.com/guides/controllers/dependencies-between-controllers/

С точки зрения:

this.get('controller');
person Teddy Zeenny    schedule 11.04.2013
comment
Спасибо, это было полезно. Что касается второго вопроса, есть ли способ получить доступ к контроллерам из глобального контекста, например, в консоли? - person Sherwin Yu; 11.04.2013
comment
Да, App.__container__.lookup('controller:post'), но только при тестировании, не используйте это внутри своего приложения. - person Teddy Zeenny; 11.04.2013
comment
Это потому, что это противоречит предполагаемому объему Эмбер? Действительно ли нет случаев, когда вы хотели бы получить доступ к контроллеру за пределами маршрута, представления или контроллера? (Я не могу придумать ни одного прямо сейчас, но я не знаю ... возможно, в случаях не-одноэлементных контроллеров, не созданных маршрутизатором) - person Sherwin Yu; 12.04.2013
comment
Я использую Ember.js уже довольно давно, и мне не нужно было обращаться к контроллерам из-за пределов этих трех классов. Что касается доступа к неодноэлементным контроллерам, нет особого смысла обращаться к ним глобально, потому что вам придется идентифицировать каждый экземпляр с каким-то идентификатором, чтобы получить его из глобальной области видимости... container.lookup('post') не будет хоть бы хватило. - person Teddy Zeenny; 12.04.2013