道场有状态观察不起作用

时间:2015-05-23 15:45:09

标签: dojo watch stateful

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

1 个答案:

答案 0 :(得分:4)

dojo/Stateful#watch仅在通过其getset API更改属性时触发。您通过直接分配有效地更改了值,Stateful无法监控。

如果您将changerAtt1方法更改为以下内容,则观察者应该正常启动:

changerAtt1: function (nv) {
    this.set('att1', nv);
}

此外,您不应继承_WidgetBaseStateful_WidgetBase已使用新的Statefulget方法扩展set,因此您只需要扩展_WidgetBase。扩展两者可能会导致错误。