我正在尝试将我的JavaScript函数转换为dojo类。我的一个JS方法中有一个setTimeOut("functionName",2000)
。如何使用dojo.declare方法从decared类中的方法调用它。例如,下面是我的自定义类。
dojo.declare("Person",null,{
constructor:function(age,country,name,state){
this.age=age;
this.country=country;
this.name=name;
this.state=state;
},
moveToNewState:function(newState){
this.state=newState;
//I need to call "isStateChanged" method after 2000 ms. How do I do this?
setTimeOut("isStateChanged",2000);
},
isStateChanged:function(){
alert('state is updated');
}
});
var person=new Person(12,"US","Test","TestState");
person.moveToNewState("NewState");
请告诉我如何在2000ms后从isStateChanged
方法调用moveToNewState
方法。
答案 0 :(得分:9)
您正在寻找的是一种绑定 this
值的方式setTimeout
将调用的函数:
moveToNewState:function(newState){
// Remember `this` in a variable within this function call
var context = this;
// Misc logic
this.state = newState;
// Set up the callback
setTimeout(function() {
// Call it
context.isStateChanged();
}, 2000);
},
以上是使用闭包来绑定上下文(请参阅:Closures are not complicated),这是执行此操作的常用方法。 Dojo可以提供内置函数来生成这些“绑定”回调(Prototype和jQuery do)。 (编辑:在peller下方的评论中,它确实指出了dojo.hitch
。)
此处有关此一般概念的更多信息:You must remember this
答案 1 :(得分:2)
这与dojo无关,这是纯粹的javascript。你在寻找的是:
var $this = this;
setTimeout(function() { $this.isStateChanged() }, 2000);
哦,请不要在函数名称周围使用引号(因为这会使它成为一个无用的字符串,可能会被eval
编辑并会出错。
答案 2 :(得分:2)
您可以简单地调用setTimeout(this.isStateChanged, 2000)
来传递正确的函数引用,这与您直接调用该方法的方式不同。立即评估表达式this.isStateChanged
。要进行调用,不需要将其包装在额外的函数中或声明局部变量。
要将this
变量绑定到被调用函数,可以使用dojo.hitch来创建自己的闭包,而不会污染局部变量空间并可能通过其他引用泄漏。
答案 3 :(得分:1)
你可以使用dojo / _base / lang并使用它的hitch方法,如下面的代码:
moveToNewState:function(newState){
// Misc logic
this.state = newState;
// Set up the callback
setTimeout(lang.hitch(this, function() {
// Call with `this`
this.isStateChanged();
}), 2000);
},