1

我遇到了类似于以下带有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);
});

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

4

1 回答 1

0

监视处理程序独立于它们添加的上下文。它们只是连接到各自的有状态对象上。在上面的代码中,watch 块的结束大括号 -})丢失了。也许,这就是问题所在。请参考下面的一个简单示例:

<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>

因此,即使添加到延迟回调中,watch 处理程序也能正常工作。此外,我看到“onValueChange”是从“onValueChange”的事件处理程序中调用的,它是递归的,最终导致stackoverflow错误。此外,“this”运算符在“dojo.connect”中有不同的上下文。请也注意这一点。

于 2013-08-27T09:19:26.637 回答