Ember.js setupController和声明<name> Controller </name>之间有什么区别

时间:2013-07-26 10:57:20

标签: ember.js

我在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 个答案:

答案 0 :(得分:22)

setupController主要用于动态设置某些控制器上下文。在你的例子中,如果标题总是“Hello world!”可以在类声明中设置它。

默认情况下,setupController会将model的{​​{1}}属性设置为路由controller挂钩返回的值。

您也可以使用它来设置另一个控制器的模型,或设置一些取决于模型的初始控制器状态。

例如,假设您有以下内容:

model

模板:

// 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

基本上,它是用于“初始化”控制器(设置模型和默认状态)。