我遇到的问题类似于跟随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”中的函数吗?
答案 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”中具有不同的上下文。请注意这一点。