我的代码看起来像这样
App.ItemRoute = Em.Route.extend({
setupController: function(controller) {
var model = this.modelFor('item');
controller.setProperties({
name : model.get('name'),
title: model.get('title')
});
}
});
App.ItemController = Em.ObjectController.extend({
saveOnChange: function() {
console.log('saveOnChange');
}.observes('name', 'title'),
});
根据我的理解,因为我使用setProperties
,观察应该只发射一次,但它会发射两次
还将setProperties
与beginPropertyChanges
&包裹起来endPropertyChanges
仍然会发射两次
我最终还是因为它根本不发射,所以我最终做的是将控制器代码更改为这样
App.ItemController = Em.ObjectController.extend({
load: false,
saveOnChange: function() {
if(!this.get('load')) {
this.set('load', true);
return;
}
console.log('saveOnChange');
}.observes('name', 'title'),
});
如果更改只被触发一次,那么这段代码就可以工作了,但如果多次触发它就不会起作用(这是我的情况)
答案 0 :(得分:1)
setProperties
函数并没有合并你的观察者(不幸的是,没有办法做到这一点),它只是将它们分组为一个操作。来源可能会帮助您更好地了解它的作用:
Ember.setProperties = function(self, hash) {
changeProperties(function() {
for(var prop in hash) {
if (hash.hasOwnProperty(prop)) { set(self, prop, hash[prop]); }
}
});
return self;
};
所以,回到你的问题。我能想到的最好方法是去除你的功能。
App.ItemController = Em.ObjecController.extend({
load: false,
saveOnChange: function() {
Em.run(this, 'debouncedSave', 150);
}.observes('name', 'title'),
debouncedSave: function() {
if(!this.get('load')) {
this.set('load', true);
}
}
});
如果您不熟悉去抖动,可以阅读here。可能还有一些其他解决方案涉及直接操纵属性,但我不确定这是否是您想要停下来的道路。