为什么我的jQuery.Widgets命名空间不能被访问?

时间:2012-04-03 15:08:01

标签: javascript jquery jquery-widgets

我一直在阅读很多关于使用 jQuery.Widget Factory 为我的插件带来的好处。其中一个功能是jQuery.widget如何为您的小部件创建一个名称平台。这很有吸引力,因为我可以在jQuery上下文中自然地维护我当前的命名空间。

问题:
我一直得到“$(”。myWidget“)。namespace.newWay不是一个函数”错误。

对于以下元素......

<div class="myWidget"></div>

THIS EXAMPLES代码工作:
虽然很好......这不是我想要实现的......因为我仍然希望我的命名空间得到尊重。

var workingVersion = {
            _init: function () { /* Do Something*/ }
        };
$.widget("ui.workingVersion", workingVersion);

$(document).ready(function () {
     $('.myWidget').workingVersion();
});

但是,我的代码失败:

var namespace = namespace || { };
;namespace.newWay = (function ($, window, document, undefined) {

     return function (options) {

          var self = this;

          this._create = function () {
               // Do something
          },
          this._init = function() {
               // Do something
          },
          this.publicFunction = function () {
               // Do something
          };
     };
})(jQuery, window, document);

$(document).ready(function () {
     $.widget("ui.namespace.newWay", namespace.newWay); //<-- Namespace does get appended
     $('.myWidget').namespace.newWay({ type: 'testing' }); //<-- But still fails here
});

我的问题是:
为什么会失败?

相关阅读:

1 个答案:

答案 0 :(得分:1)

这个答案有点晚了,也许,但是我在同样的事情上苦苦挣扎,不得不做一些阅读。

$()一般

$()实例是一个无命名空间的快捷方式列表,用于分布在不同命名空间的不同功能。您可以通过编写以下内容为此快捷方式列表添加更多功能:

$.fn.myFunction = function() {
    ...
};

然后通过调用

来访问它
$("...").myFunction(); 

如果使用相同的名称添加两个函数,则后者将覆盖第一个函数。

<强>窗口小部件

当你创建一个带有命名空间的窗口小部件时,它就像你期望的那样用它的命名空间创建,但是$()它没有添加它的命名空间,作为真正的widget-with-shortcut的简化快捷方式。这是使用$.widget.bridge()完成的。因此,您可以通过以下方式创建自己的$()命名空间链接:

$.widget.bridge("namespace_myFunction", $.namespace.myFunction );

然后像这样访问您的小部件:

$("#myDiv").namespace_myFunction();

要直接使用小部件的原始命名空间,您可以改为调用它:

$.namespace.myWidget(
  {
    option1: "",
    option2: ""
  },
  $("#div")
);

希望这会澄清一点......