我创建了一些小部件工厂,我想在公共方法中访问它的选项或方法,但它返回错误“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方法中的选项,它可以正常工作。谢谢你。
答案 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);
},