Skip to content

Latest commit

 

History

History
73 lines (45 loc) · 2.79 KB

Chapter7: Ember Controller.md

File metadata and controls

73 lines (45 loc) · 2.79 KB

Ember Controller

Controller 用来处理和特定的UI相关的非持久逻辑,他们通常包含一个模型或者模型数组.你可以在controller中放置函数,属性以及observers,它们的功能很像正常的Ember对象,但是有一些例外.

首先我们来看一下三种不同类型的controller.

三个Controller的故事

Ember提供了三种不同类型的controller:ObjectController, ArrayController, 和Controller.当路由读取一个单独的model时,使用ObjectController.当路由读取一组model时,使用ArrayController.当路由没有获取任何model时,使用Controller.

属性,Observers和函数

当进入controller时没有需要调用的特定的hooks.如果你真的需要的话,可以使用init,但是你不应该这样做,controller所有的设置工作应该在route中完成,通常在route的setupController hook.

还剩下什么?属性,observers和函数,这些都是你的基本材料.

// app/assets/javascripts/controllers/user.js
App.UserController = ObjectController.extend({

  someFunction: function() { alert('so functional') },

  someProperty: function() {
    if (this.get('model.firstName') == "Gregory") {
      return "Hey Gregory"
    } else {
      return "Hey, you're not Gregory"
    }
  }.property('model.firstName'),

  someObserver: function() {
    alert("You changed your name? I don't really see you as a " + this.get('model.firstName'));
  }.observes('model.firstName')

})

你可以把你喜欢的尽可能多的放在你的controller中,任何controller的属性都可以被模板和视图使用.

Mixins

如果你发现一些重复的逻辑,你可以把他们提取到一个Ember.Mixin,你的controller像这样继承它:

// app/assets/javascripts/mixins/excited.js
App.Excited = Ember.Mixin.create({
  levelOfExcitement: "I'm so freaking excited right now!!!"
})

// app/assets/javascripts/controllers/user.js
App.UserController = ObjectController.extend(App.Excited, {
  // your controller code
})

现在UserController有一个levelOfExcitement属性,创建mixin使用.create而不是.extend.

执行模板的Action

controller的另一个主要用途是处理模板的操作.例如,一个模板可能有一个提交按钮和一个删除链接.它们的操作会像这样被处理:

// app/assets/javascripts/controllers/user.js
App.UserController = ObjectController.extend({

  actions: {

    deleteUser: function() { this.get('model').destroyRecord() },

    saveChanges: function() { this.get('model').save() }

    }
})

在controller中所有操作的处理程序都要放在actions对象中,这是一个保持你的代码结构的Ember的惯例.