Почему мое пространство имен jQuery.Widgets не доступно? - PullRequest
1 голос
/ 03 апреля 2012

Я много читал о преимуществах использования jQuery.Widget Factory для моих плагинов. Одна из упомянутых возможностей - то, как jQuery.widget создает пространство имен для вашего виджета. Это привлекательно, поскольку я могу поддерживать свое текущее пространство имен (естественно) в контексте jQuery.

ПРОБЛЕМА:
Я продолжаю получать сообщение "$ (". MyWidget "). Namespace.newWay не является функцией".

Для следующего элемента ...

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

МОЙ ВОПРОС:
Почему не получается?

СВЯЗАННОЕ ЧТЕНИЕ:

1 Ответ

1 голос
/ 12 января 2015

Этот ответ приходит немного поздно, может быть, но я боролся с тем же, и мне пришлось немного почитать.

$ () в целом

Экземпляр $() представляет собой список ярлыков без пространства имен для различных функций, распределенных по различным пространствам имен. Вы можете добавить больше функций в этот список, написав:

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

К которому затем можно обратиться, позвонив по номеру

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

Если вы добавите две функции с одинаковыми именами, последняя заменит первую.

Виджеты

Когда вы создаете виджет с пространством имен, он создается с его пространством имен, как и следовало ожидать, но к $() он добавляется без пространства имен, как упрощенный ярлык для вашего реального виджета с ярлыком. Это делается с помощью $.widget.bridge(). Поэтому вы можете создать свою собственную ссылку на пространство имен на $ (), написав так:

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

А затем получите доступ к вашему виджету так:

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

Чтобы использовать виджет напрямую с его оригинальным пространством имен, вы можете вместо этого вызвать его следующим образом:

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

Надеюсь, это прояснит немного ...

...