require(["dojo/_base/declare","dijit/_WidgetBase","dojo/Stateful"],function(declare,_WidgetBase,Stateful){
MaClasse1 = declare([_WidgetBase,Stateful],{
att1:{'a':'att1_v1','b':'1234'},
id:'mc1',
changerAtt1: function(nv){
this.att1 = nv;
}
});
MaClasse2 = declare([_WidgetBase,Stateful],{
att1:null,
id:'mc2',
constructor: function(att1){
this.att1 = att1;
},
postCreate: function(){
this.watch('att1',function(name,oldValue, value){ // Doesn't work
console.log(name,oldValue, value);
});
}
});
var maClasse1 = new MaClasse1();
var maClasse2 = new MaClasse2(maClasse1.get('att1'));
maClasse1.changerAtt1({'a':'att1_v2','b':'56789'});
});
MaClasse1和MaClasse2类共同具有属性' att1',该属性是两个类的单个实体,因为它是一个对象。我不明白为什么当改变att1的值时,MaClasse2实例的this.watch
不起作用。任何人都可以向我解释。
这是我更正后的代码:
require(["dojo/_base/declare","dijit/_WidgetBase"],function(declare,_WidgetBase){
MaClasse1 = declare([_WidgetBase],{
});
MaClasse2 = declare([_WidgetBase],{
});
var att1 = {'a':'att1_v1','b':'1234'};
var maClasse1 = new MaClasse1();
maClasse1.set('att1',att1);
var maClasse2 = new MaClasse2();
maClasse2.set('att1',maClasse1.get('att1'));
maClasse2.watch('att1',function(name, oldValue, value){//<--- this doesn't work
console.log("Execution du watch: ",name, oldValue, value);//<--- this doesn't work
});//<--- this doesn't work
console.log('Avant chgt: ',att1, att1 === maClasse1.get('att1'),att1 === maClasse2.get('att1'));
att1.a = 'att1_v2';
console.log('Après chgt: ',att1, att1 === maClasse1.get('att1'),att1 === maClasse2.get('att1'));
});
答案 0 :(得分:4)
dojo/Stateful#watch
仅在通过其get
和set
API更改属性时触发。您通过直接分配有效地更改了值,Stateful无法监控。
如果您将changerAtt1
方法更改为以下内容,则观察者应该正常启动:
changerAtt1: function (nv) {
this.set('att1', nv);
}
此外,您不应继承_WidgetBase
和Stateful
。 _WidgetBase
已使用新的Stateful
和get
方法扩展set
,因此您只需要扩展_WidgetBase
。扩展两者可能会导致错误。