this.watch没有被调用deferred.then()

时间:2013-07-30 07:18:11

标签: javascript dojo

我遇到的问题类似于跟随dojo deferred的代码: -

这是XXX.js文件

dojo.declare('XXX', [dijit._Widget, dijit._Templated], {

postCreate: function() {
  //getting deferred from somewhere
  var _this = this;
  deferred.then(function(response) {
      console.log("This is getting printed");
      _this.watch("value", function(A, B, C) {
        console.log("This is not getting printed");
        var value = _this.get("value");
        _this.onValueChange(value);
  });

}

我用以下代码将此类称为其他JS文件: -

this.object = new XXX({ 
                    //some args
                }
dojo.connect(this.object, "onValueChange", function(value) {
                    console.log("I am here");
                    this.onValueChange(value);
});

当我使用相同的“watch”而没有deferred.then时,它工作得非常好但是现在它在我更改表单中的值时没有执行该功能。有什么指针吗? 可能是因为当我的“this.object”被创建时,deferred没有执行“then”中的函数吗?

1 个答案:

答案 0 :(得分:0)

监视处理程序与它们添加的上下文无关。它们只是挂在各自的Stateful对象上。在上面的代码中,监视块的结束括号 - })丢失了。也许,这就是问题所在。请参考下面的一个简单示例:

<script type='text/javascript'>
    dojo.require("dijit.form.TextBox");
    dojo.require("dojo._base.Deferred");
    dojo.require("dojo.ready");

    var def = null;

    dojo.ready(function(){
        def = new dojo._base.Deferred();
        var _this = dijit.byId('namefield');
        def.then(function(resp) {
          _this.watch("value",function(a,b,c) {
            console.info(''+a+'-'+b+'-'+c);
          });
        });
    });
    function func() {
        if(def) {
          def.resolve(true);
          console.info('resolved');
        }
    }
</script>
</head>
<body class="claro">
    <input type="text" dojoType="dijit.form.TextBox" id="namefield" name="namefield"/>
    <button onclick='func()'>click</button>
</body>

因此,即使在延迟回调中添加了监视处理程序也是如此。 此外,我看到“onValueChange”是在“onValueChange”的事件处理程序中调用的,它是递归的并最终出现在stackoverflow错误中。此外,“this”运算符在“dojo.connect”中具有不同的上下文。请注意这一点。