window.setInterval()的dojo.hitch()范围

时间:2012-09-04 14:29:15

标签: javascript dojo scope

我正在尝试使用dojo fadeIn / Out产生闪烁效果。

在widget类的声明中定义了以下代码片段:

 _startHighlightEffect : function() {
      var blinkInterval = 5000; //Scope here is that of the parent widget
      window.setInterval ( function() {
              dojo.fadeOut(
              {
                      node: this._headerDiv.domNode,
                      onEnd: function() {
                              dojo.fadeIn({node: this._headerDiv.domNode},3000).play();
                      }
              },3000).play();
      }, blinkInterval);
  },

_highlightEffect : function() {
    this.func = dojo.hitch(this,this._startHighlightEffect);
    this.func();
}

我面临的问题是它说“this._headerDiv未定义”。在使用firebug进行检查时,this._headerDiv的范围是Window而不是父窗口小部件。

请帮助我理解我在这里失踪的内容。

2 个答案:

答案 0 :(得分:3)

@jbabey描述的内容是可行的,但就dojo.hitch而言,您在错误的函数上使用它。您需要关联传递给setInterval的函数。

_startHighlightEffect : function() {
  var blinkInterval = 5000; //Scope here is that of the parent widget

  // hitch the function that will be executed by the setInterval call *********
  window.setInterval (dojo.hitch(this, function() {
          dojo.fadeOut(
          {
                  node: this._headerDiv.domNode,
                  onEnd: dojo.hitch(this, function() {
                          dojo.fadeIn(
                                {node: this._headerDiv.domNode},3000).play();
                  })
          },3000).play();
  }, blinkInterval));
},

_highlightEffect : function() {
  this._startHighlightEffect();
}

答案 1 :(得分:2)

您可以在上下文中保存上下文,并在以后使用它:

_startHighlightEffect : function() {
      var blinkInterval = 5000; //Scope here is that of the parent widget
      var that = this; // save the scope
      window.setInterval ( function() {
              dojo.fadeOut(
              {
                      node: that._headerDiv.domNode, // use the saved scope
                      onEnd: function() {
                              dojo.fadeIn({node: that._headerDiv.domNode},3000).play();
                      }
              },3000).play();
      }, blinkInterval);
  }