我正在尝试构建一个没有原型扩展的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上运行?
答案 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
});
}
});
好的,这个编辑用于回答下面提到的错误(?)
好吧,有时可能需要fire the observer on initialization time。
Ember.observer
是一种Ember
命名空间方法,不属于Ember.Object
原型的一部分。因此,this.observer
永远不存在,但addObserver()
确实存在。
无需调用处理程序,Ember运行时将在属性更改时调用处理程序
调用this._super
是不必要的,除非它确实重要。在这种情况下,如果Person
只是扩展Ember.Object
,则调用超级不会做任何事情。
默认情况下,除非在类定义期间覆盖它,否则不执行任何操作。
它的上下文,只要OP没有指定关于类定义的任何内容,它就超出了回答的范围。
答案 1 :(得分:8)
接受的答案实际上包含五个不同程度的严重错误。
它不必要地将观察者设置在init钩子中。
它使用init
代替Ember.observer
错误地设置this.observer
挂钩内的观察者,这甚至不起作用。
在初始时无法调用(而不是设置)处理程序。
无法在超类上调用init
。
它不必要地使用reopen
。
init
hook 在init挂钩中不需要任何程序“调用”或“调用”来设置观察者。当实例化对象时,以下两种形式中的任何一种都会自动设置它们。
fullNameChanged: function() { } . observes('fullName')
observeFullNameChanged: Ember.observer('fullName', this.fullNameChanged.bind(this))
object.observer
进行观察员的程序设置。如果确实想要在程序上设置观察者,那么请调用object.observer
,而不是Ember.observer
,其定义为如上所述。从程序上调用Ember.observer
将无所作为; Ember不知道要观察的属性是什么。在这种情况下,它将是this.observer('fullName', ...)
(尽管如上所述,你根本不需要这样做;而是使用第1点的方法。)
init
但您也希望在init
时调用处理程序。有三种方式:
init: function() { this.fullNameChanged(); /* call super */ }
initFullNameChanged: Ember.on('init', this.fullNameChanged.bind(this))
fullNameChanged: function() { ... }.on('init')
其中第三个选项使用您不想要的原型扩展。
super
init
如果您要使用init
挂钩,即使不需要,也需要拨打super
,否则会出现可怕的情况:
init: function() {
...
this._super.apply(this, arguments);
}
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);
})