Ember.js:关于控制器的问题,"这个","内容"和模型结构

dou*_*ack 6 javascript scope ember.js

我正在深入了解我的第一个功能应用程序,需要更好地了解我的控制器中发生了什么.

在这里,我有一个控制器,当用户点击"选项"时处理动作.看一下这个this对象提出了几个问题:

  1. 到底是this什么?我希望它是我的Option模型的一个实例,但它缺少一些属性(比如"identity:'model:Option'").
  2. 如果this是我的Option模型的实例,为什么'model'属性未定义?为什么不知道呢?
  3. 什么是this.content?看起来有些东西在里面content(idisSuppressed)而有些东西不在(this.isSelected) - 为什么呢?

免责声明:虽然到目前为止还没有任何问题,但我的ember应用程序架构肯定会出现错误.

截图调试控制器: 检查ember.js控制器和数据

选项模型和控制器

App.Option = Ember.Object.extend({
    identity: 'model: Option',
    id: '',
    cost: '',
    isSelected: false,
    isSuppressed: false
});
App.OptionController = Ember.Controller.extend({
    actions: {
        toggleOption: function() {
            this.set('isSelected', !this.get('isSelected'));
            var id = this.get('content.id');
            this.send('deselect', this.get('content.id'));
        }
    }
});
App.OptionsController = Ember.ArrayController.extend({
    actions: {
        deselect: function(exception) {
            var opts = this.rejectBy('id', exception)
            opts.setEach('isSuppressed', true);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

Kin*_*n2k 3

这取决于在哪里this,如果您在控制器中,那么它就是控制器。如果您的控制器是ObjectController/ ArrayController,它将代理 get/set 调用到底层模型。 content/model在控制器的上下文中是相同的。

这些属性很少直接存在于实例上,通常它们是隐藏的,以阻止在不使用 getter/setter 的情况下访问属性。

在上面的代码中,您很有可能OptionController应该扩展ObjectController. 除非控制器没有模型支持。如果您使用Ember.Controller.extend它,它不会将 getter/setter 代理到模型,它将存储、从控制器本身检索属性。