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

时间:2013-12-02 17:25:37

标签: javascript ember.js scope

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

这里我有一个控制器,可以在用户点击“选项”时处理操作。查看this对象会引发一些问题:

  1. 究竟是什么this?我希望它是我的Option模型的一个实例,但它缺少一些属性(比如“identity:'model:Option'”)。
  2. 如果this是我的Option模型的一个实例,为什么'model'属性未定义?为什么不知道呢?
  3. 什么是this.content?看起来有些东西在contentidisSuppressed)内,有些则不在(this.isSelected) - 为什么会这样?
  4. 免责声明:虽然到目前为止还没有任何问题,但我的ember应用程序架构肯定会出现错误。

    屏幕截图调试控制器: inspecting ember.js controller & data

    期权模型&控制器

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

1 个答案:

答案 0 :(得分:3)

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

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

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