Ember.observer在init上运行

时间:2015-04-11 15:08:46

标签: javascript ember.js

我正在尝试构建一个没有原型扩展的Ember应用程序,而Ember文档提供了如何执行此操作的示例,但它们不包含我希望我的观察者在init上运行的示例。 所以目前我的代码是这样编写的:

fullNameChanged: function() {
   // deal with the change
}.observes('fullName').on('init')

我能找到的唯一一个例子就是这样:

Person.reopen({
  fullNameChanged: Ember.observer('fullName', function() {
    // deal with the change
  })
});

那么我怎么能告诉这段代码在init上运行?

2 个答案:

答案 0 :(得分:13)

可能你正在寻找这个

Person.reopen({
    fullNameChanged: Ember.on('init', Ember.observer('fullName', function () {
        // deal with the change
    }))
});

或(如果在init上发生变更,则会赢得

Person.reopen({
  init: function(){
    Ember.observer('fullName', function() {
      // deal with the change
    });
  }
});

好的,这个编辑用于回答下面提到的错误(?)

  1. 好吧,有时可能需要fire the observer on initialization time

  2. Ember.observer是一种Ember命名空间方法,不属于Ember.Object原型的一部分。因此,this.observer永远不存在,但addObserver()确实存在。

  3. 无需调用处理程序,Ember运行时将在属性更改时调用处理程序

  4. 调用this._super是不必要的,除非它确实重要。在这种情况下,如果Person只是扩展Ember.Object,则调用超级不会做任何事情。

      

    默认情况下,除非在类定义期间覆盖它,否则不执行任何操作。

  5. 它的上下文,只要OP没有指定关于类定义的任何内容,它就超出了回答的范围。

  6. Nothing better explains than an example

答案 1 :(得分:8)

接受的答案实际上包含五个不同程度的严重错误。

  1. 它不必要地将观察者设置在init钩子中。

  2. 它使用init代替Ember.observer错误地设置this.observer挂钩内的观察者,这甚至不起作用。

  3. 在初始时无法调用(而不是设置)处理程序。

  4. 无法在超类上调用init

  5. 它不必要地使用reopen

  6. 1。无需在init hook

    中设置观察者

    在init挂钩中不需要任何程序“调用”或“调用”来设置观察者。当实例化对象时,以下两种形式中的任何一种都会自动设置它们。

    fullNameChanged:        function() { } . observes('fullName')
    observeFullNameChanged: Ember.observer('fullName', this.fullNameChanged.bind(this))
    

    2。使用object.observer进行观察员的程序设置。

    如果确实想要在程序上设置观察者,那么请调用object.observer,而不是Ember.observer,其定义为如上所述。从程序上调用Ember.observer将无所作为; Ember不知道要观察的属性是什么。在这种情况下,它将是this.observer('fullName', ...)(尽管如上所述,你根本不需要这样做;而是使用第1点的方法。)

    3。在init

    上调用处理程序

    但您也希望在init调用处理程序。有三种方式:

    init:                function() { this.fullNameChanged(); /* call super */ }
    initFullNameChanged: Ember.on('init', this.fullNameChanged.bind(this))
    fullNameChanged:     function() { ... }.on('init')
    

    其中第三个选项使用您不想要的原型扩展。

    4。从super

    致电init

    如果您要使用init挂钩,即使不需要,也需要拨打super,否则会出现可怕的情况:

    init: function() {
      ...
      this._super.apply(this, arguments);
    }
    

    5无需reopen

    reopen在这里完成任何事情。只需将上述属性放入类定义本身即可。

    解决方案

    对等于

    的正确答案
    fullNameChanged: function observer() { }.observes('fullName').on('init')
    

    因此

    fullNameChanged:        function() { },
    observeFullNameChanged: Ember.observer('fullName', this.fullNameChanged.bind(this)),
    initFullNameChanged:    Ember.on('init', this.fullNameChanged.bind(this))
    

    这样做可能是等效的,也可能更具可读性:

    initFullNameChanged: Ember.on('init', function() {
    
      // define and execute handler
      (function fullNameChanged() { ... }());
    
      // set up obsever
       this.observe('fullName, fullNameChanged);
    })