2

BenAlmanによるPub/Subライブラリを読んでいると、最初の行で、彼が空のオブジェクトをjQuery関数に渡したことに混乱しました。また、彼はバインド関数オブジェクトを使用して、ほぼ「空の」オブジェクトに適用します(firebugを使用してそのオブジェクトを調べ、jQueryオブジェクトに空のオブジェクトが含まれていることを返します)。誰かが私のためにこの論理を説明できますか?どうもありがとう!P / S:フレームワーク以外のコンテキストでのPub / Subパターンの使用法と考え方を理解していますが、jQueryでの実装を理解していません。

これが私が読んだライブラリのコードです:

 (function($){
    var o = $({});
    $.subscribe = function() {
        o.bind.apply( o, arguments );
    };
    $.unsubscribe = function() {
        o.unbind.apply( o, arguments );
    };
    $.publish = function() {
        o.trigger.apply( o, arguments );
    };
 })(jQuery);
4

2 に答える 2

2

要素のjQueryオブジェクトを作成すると...最終オブジェクトにはすべてのjQueryメソッドが含まれます

簡略化した例:

{ element: 'div'
    jQuery:{
      hide:function(){},
      animate:function(){}
       on:function(){}
    }

}

デモコードの空のオブジェクトは、同じことを実行できるようにするために使用されます。$()オブジェクトがプロパティとしてjQueryメソッドの多く(すべてではない)を含むため、ラップされると、jQueryイベントハンドラーをバインドできます。

あなたは書くことができます:

o.on('myCustomeEvent',doSomething);

そしてコードの別の部分で

o.trigger('myCustomeEvent');
于 2012-12-26T02:46:51.317 に答える
1

これは、イベントハンドラーを格納するためのある種の空のコンテナーを作成する方法にすぎません。

jQueryドキュメント[docs]で説明されているように、一部のjQueryメソッドはDOM要素以外のオブジェクトでも使用できます 。

プレーンオブジェクトの操作

現在、 jQuery.data()でラップされたプレーンJavaScriptオブジェクトでサポートされている操作は、、、、、、およびのみです。プレーンオブジェクトで(またはを必要とするメソッド)を使用すると、(など)と呼ばれるオブジェクトに新しいプロパティが作成されます。.prop().bind().unbind().trigger().triggerHandler().data().data()jQuery{randomNumber}jQuery123456789

// define a plain object
var foo = {foo:'bar', hello:'world'};

// wrap this with jQuery
var $foo = $(foo);

// test accessing property values
var test1 = $foo.prop('foo'); // bar

// test setting property values
$foo.prop('foo', 'foobar');
var test2 = $foo.prop('foo'); // foobar

// test using .data() as summarized above
$foo.data('keyName', 'someValue');
console.log($foo); // will now contain a jQuery{randomNumber} property

// test binding an event name and triggering
$foo.bind('eventName', function (){
    console.log('eventName was called');
});

$foo.trigger('eventName'); // logs 'eventName was called'

[...]

および.triggerドキュメント [ドキュメント]

この.trigger()メソッドは、pub/subメカニズムに似たプレーンなJavaScriptオブジェクトをラップするjQueryコレクションで使用できます。オブジェクトにバインドされたイベントハンドラーは、イベントがトリガーされたときに呼び出されます。

それはまさにコードで起こっていることです:

  • var o = $({});空のプレーンオブジェクトからjQueryオブジェクトを作成します。
  • o.bind.apply( o, arguments );イベントハンドラーをそのオブジェクトにバインドします。
  • o.trigger.apply( o, arguments );そのオブジェクトにバインドされたイベントハンドラーをトリガーします。
于 2012-12-26T02:40:27.087 に答える