1

我一直在阅读很多关于为我的插件使用jQuery.Widget Factory的优势。被吹捧的功能之一是 jQuery.widget 如何为您的小部件创建命名空间。这很有吸引力,因为我可以(自然地)在 jQuery 上下文中维护我当前的命名空间。

问题:
我不断收到“$(".myWidget").namespace.newWay is not a function”错误。

对于以下元素...

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

这个示例代码有效:
虽然很好......这不是我想要实现的......因为我仍然希望我的命名空间得到尊重。

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
});

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

相关阅读:

4

1 回答 1

2

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

$() 一般

$()实例是分布在不同命名空间中的不同功能的无命名空间快捷方式列表。您可以通过编写以下方式将更多功能添加到此快捷方式列表中:

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

然后将通过调用访问

$("...").myFunction(); 

如果添加两个同名的函数,后一个将覆盖第一个。

小部件

当您创建具有命名空间的小部件时,正如您所期望的那样,它是使用它的命名空间创建的,但是$()添加到它时没有它的命名空间,作为您真正的小部件快捷方式的简化快捷方式。这是使用$.widget.bridge(). 因此,您可以通过如下方式创建自己的到 $() 的命名空间链接:

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

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

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

要直接将小部件与它的原始命名空间一起使用,您可以像这样调用它:

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

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

于 2015-01-12T08:20:26.320 回答