【问题标题】:Proper way to create an instance variable using jQuery UI Widget Factory使用 jQuery UI Widget Factory 创建实例变量的正确方法
【发布时间】:2012-12-13 20:13:18
【问题描述】:

我正在使用 jQuery UI 小部件工厂。

$.widget("myPlugin" , {

    options: {
    },

    _create: function() {
    },

    instanceVar: "huzzah!"

});

在测试中,instanceVar 似乎实际上是原型的一部分。所以插件的所有实例都是一样的。

我可以通过将 instanceVar 放入选项来解决此问题,如下所示:

$.widget("myPlugin" , {

    options: {
        instanceVar: "huzzah!"
    },

    _create: function() {
    },

});

但这似乎很奇怪,因为 instanceVar 只是插件使用的一个内部变量——插件的用户应该能够更改它。

还有其他(更好的)方法可以实现这一点吗?

感谢您的帮助!

【问题讨论】:

  • 可以在实例本身存储私有数据,例如在_create里面应该可以做到this.instanceVar = "huzzah!"

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


【解决方案1】:

你可以在实例本身存储私有数据,例如在_create里面,你应该可以做到this.instanceVar = "huzzah!"

$.widget("ui.myPlugin", {

    options: {
        foo: "foo"
    },

    _create: function() {
        this.instanceVar = "huzzah!"
    },

    _setOption: function() {
        this.instanceVar = "worky!";
    },

    destroy: function() {
        console.log(this.instanceVar);  
    }

});

$(document).myPlugin().myPlugin("option","foo","bar").myPlugin("destroy"); // "worky"

$("body").myPlugin().myPlugin("destroy"); // "huzzah!

演示:http://jsfiddle.net/PGUqr/

【讨论】:

  • 您也可以像声明函数一样声明私有实例变量,使用下划线前缀作为约定。 _instanceVar:未定义,
  • 应该注意的是,使用下划线前缀实际上并不能阻止对此类“私有”成员和方法的访问。您仍然可以通过 $('#myElement').data('pluginName')._foo 访问它们。添加下划线的作用是通过在小部件上调用方法的常用方法省略该函数:$('#myElement').pluginName('somePublicFunction')。一旦您引用了小部件实例,您就可以完全访问所有内容,无论它是否有前导下划线。
  • 还要注意,虽然option 成员没有下划线,但文档表明通过 .option() 方法访问其内容:api.jqueryui.com/jquery.widget/#method-option
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
相关资源
最近更新 更多