14

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!'
});

そしてsetupControllerfrom ルートを削除します。

を使用する目的/利点は何setupControllerですか?

4

1 に答える 1

23

setupController主に、一部のコントローラーコンテキストを動的に設定するためのものです。あなたの例では、タイトルが常に「Hello world!」になる場合 クラス宣言で設定しても問題ありません。

デフォルトでは、 のプロパティをルートのフックから返された値にsetupController設定します。modelcontrollermodel

たとえば、別のコントローラーのモデルを設定したり、モデルに依存するコントローラーの初期状態を設定したりすることもできます。

たとえば、次のものがあるとします。

// 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);
    }
  }
}); 

つまり、基本的には、コントローラーを「初期化」するためのものです(モデルとデフォルト状態を設定します)。

于 2013-07-26T11:30:33.230 に答える