jQuery小部件工厂访问setInterval中的公共方法中的选项和方法

时间:2012-11-03 07:26:41

标签: jquery jquery-ui web jquery-ui-widget-factory

我创建了一些小部件工厂,我想在公共方法中访问它的选项或方法,但它返回错误“142 Uncaught TypeError:Object has no method”或“not not read property”。如何正确访问它?

以下是示例:

function($){
  $.widget("demo.myWidget",{ 
    options:{
      myVar:0
    },
    _create:function(){
      //this line work in here
      alert(this.options.myVar);
    },
    calledFunction : function(){
      alert(this._getVar());
    },
    pubFunction : function(){
      setInterval(this.calledFunction, 1000);
    },
    _getVar : function(){
      return this.options.myVar;
    }
  });
}(jQuery));

$(document).ready(function(){
   $("selector").myWidget();
   $("selector").myWidget("pubFunction");
});

如果我访问_create方法中的选项,它可以正常工作。谢谢你。

1 个答案:

答案 0 :(得分:2)

您的大部分代码都很好,但是在匿名函数末尾附近有语法错误。对$.widget()的调用没有正确结束,永远不会调用匿名函数本身。

尝试:

(function($) {
  $.widget("demo.myWidget", { 
    options: {
      myVar:0
    },
    _create: function() {
      //this line work in here
      alert(this.options.myVar);
    },
    calledFunction: function() {
      alert(this._getVar());
    },
    pubFunction: function() {
      this.setInterval(this.calledFunction, 1000);
    },
    _getVar : function() {
      return this.options.myVar;
    }
  });        // <-- End call to $.widget().
})(jQuery);  // <-- End anonymous function and call it with the jQuery object.

完成此操作后,代码将按预期工作。您可以在this fiddle中进行测试。

编辑:关于评论中描述的问题,那是因为当setInterval()调用您的回调函数时,this绑定到全局对象(window在我们的例子中),而不是你的对象。您可以使用$.proxy()处理该问题:

pubFunction : function() {
  setInterval($.proxy(this.calledFunction, this), 1000);
},