Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js setupController和声明a<;之间有什么区别;名称>;控制器_Ember.js - Fatal编程技术网

Ember.js setupController和声明a<;之间有什么区别;名称>;控制器

Ember.js setupController和声明a<;之间有什么区别;名称>;控制器,ember.js,Ember.js,我在Ember.js官方教程中看到许多令人困惑的例子 我不喜欢的一个例子是: App.ApplicationRoute = Ember.Route.extend({ setupController: function(controller) { controller.set('title', "Hello world!"); } }); App.ApplicationController = Ember.Controller.extend({ appNa

我在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
主要用于动态设置某些控制器上下文。在您的示例中,如果标题始终是“Hello world!”,则可以在类声明中设置它

默认情况下,
setupController
controller
model
属性设置为从路由的
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}}

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

我不太明白为什么在类声明的控制器中不能处理动态上下文,你能给我一个例子吗?因为当控制器实例化时,最初没有模型,因此,如果取决于模型属性,则无法正确设置某些默认状态。我很高兴看到一个示例,我很难理解我是Ember的新手。我在回答中添加了一个示例,说明了
setupController
可以用于什么。请注意,
isEditing
不在模型中(不需要持久化),在控制器上
i编辑
仅保存当前控制器的某些状态,即编辑模式是打开还是关闭。您链接到的示例只需更改一些模型属性,当然不涉及控制器状态。
App.PostRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    this._super(controller, model);
    if (model.get('autoEdit')) {
      controller.set('isEditing', true);
    }
  }
});