1

プラグインにjQuery.WidgetFactoryを使用する利点についてたくさん読んでいます。宣伝されている機能の1つは、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
});

私の質問は:
なぜ失敗するのですか?

関連読書:

4

1 に答える 1

2

この答えは少し遅れるかもしれませんが、私は同じことで苦労していて、いくつかの読書をしなければなりませんでした。

一般的に$()

$()インスタンスは、さまざまな名前空間に分散しているさまざまな関数への名前空間のないショートカットリストです。次のように記述して、このショートカットリストに関数を追加できます。

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

次に、を呼び出すことによってアクセスされます

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

同じ名前で2つの関数を追加すると、後者の関数が最初の関数を上書きします。

ウィジェット

名前空間を使用してウィジェットを作成すると、予想どおり、名前空間を使用して作成されますが$()、実際のショートカット付きウィジェットへの簡略化されたショートカットとして、名前空間なしで追加されます。これはを使用して行われ$.widget.bridge()ます。したがって、次のように記述して、$()への独自の名前空間リンクを作成できます。

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

そして、次のようにウィジェットにアクセスします。

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

元の名前空間でウィジェットを直接使用するには、代わりに次のようにウィジェットを呼び出すことができます。

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

これが少し明確になることを願っています...

于 2015-01-12T08:20:26.320 に答える