Ember.js В чем разница между setupController и объявлением контроллера <Name>

Я вижу много запутанных примеров в официальных учебниках Ember.js.

Один пример, который мне действительно не нравится:

App.ApplicationRoute = Ember.Route.extend({
      setupController: function(controller) {
      controller.set('title', "Hello world!");
   }
});

App.ApplicationController = Ember.Controller.extend({
    appName: 'My First Example'
});

Теперь, насколько я понимаю, я мог бы написать это так:

   App.ApplicationController = Ember.Controller.extend({
      appName: 'My First Example',
      title: 'Hello world!'
   });

И удалив этот setupController из маршрута.

Какова цель/польза от использования setupController?

Ответ 1

setupController предназначен в первую очередь для динамического создания некоторого контекста контроллера. В вашем примере, если заголовок всегда будет "Hello world!" это прекрасно, чтобы установить его в объявлении класса.

По умолчанию setupController устанавливает свойство model controller в значение, возвращаемое с model hook маршрута.

Вы также можете использовать это, например, для установки модели другого контроллера или для установки некоторого начального состояния контроллера, которое зависит от модели.

Например, предположим, что у вас есть следующее:

// Model
App.Post = DS.Model.extend({
  title: DS.attr('string'),
  text: DS.attr('string'),
  autoEdit: DS.attr('string')
});

// Controller
App.PostController = Ember.ObjectController.extend({
  isEditing: null,
  toggleEdit: function() { this.toggleProperty('isEditing'); }
});

Шаблон:

<a href="#" {{action 'toggleEdit'}}>Toggle edit mode</a>

{{#if isEditing}}
  {{input type="text" value=title placeholder="Title"}}
  {{textarea type="text" value=text placeholder="Text"}}
{{else}}
  <h1>{{title}}<h1>
  <article>{{text}}</article>
{{/if}}

И затем вы решите, что было бы неплохо включить режим редактирования по умолчанию для сообщений с autoEdit равным true. Вероятно, вы захотите сделать это на маршруте (поскольку контроллер при создании экземпляра ничего не знает о модели):

App.PostRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    this._super(controller, model);
    if (model.get('autoEdit')) {
      controller.set('isEditing', true);
    }
  }
}); 

В принципе, это для "инициализации" контроллера (настройка модели и состояние по умолчанию).