0

jQueryの小さなPubSubは、プリミティブ値またはオブジェクトを渡す場合に最適ですが、配列に問題があります。したがって、配列をオブジェクトにラップする必要があります。

(function($) {
  var o = $({});
  $.subscribe = function() {
    o.on.apply(o, arguments);
  };
  $.unsubscribe = function() {
    o.off.apply(o, arguments);
  };
  $.publish = function() {
    o.trigger.apply(o, arguments);
  };
}(jQuery));
$.subscribe('test',function(e,data){
    console.log(data);
})
$.publish('test',1);       //1
$.publish('test',{a:1});   //{a:1}
$.publish('test',[2,3,4]); //2
$.publish('test',{arr:[2,3,4]})  //{arr:[2,3,4]}

私はそれのいくつかの改良版を見てきました。それは主にサブスクライバーのキャッシュに焦点を合わせていますが、それらのどれも配列を渡すことができません。したがって、2つの質問:

  • PubSubを介して配列を渡すのは良い考えですか?
  • どうやってするか?
4

2 に答える 2

0

配列に適用機能を使用することはできません。適用とオブジェクトインスタンスの呼び出しのみを使用できます。

配列には、各インデックスにオブジェクトを含めることができます。

于 2012-08-28T02:55:20.387 に答える
0

さて、とにかくそれを理解します。

他の人にとっては問題ではないかもしれませんが、配列を渡すことができないことPubSubは非常に混乱し、私にとっては不便です。そこでPubSub、jQueryのカスタムイベントを使用する代わりに、独自のイベントを作成することにしました。

(function (Global) {
    var cache = {};
    Global.PubSub = Global.PubSub || {
        on: function (e, fn) {
            if (!cache[e]) {
                cache[e] = [];
            }
            cache[e].push(fn);
        },
        off: function (e, fn) {
            if (!cache[e]) {
                return;
            }
            var fns = cache[e];
            if (!fn) {
                fns.length = 0;
            }
            var index = fns.indexOf(fn);
            if (index !== 0) {
                fns.splice(index, 1);
            }
        },
        trigger: function (e, data) {
            if (!cache[e]) {
                return;
            }
            var fns = cache[e];
            for (var i = 0; i < fns.length; ++i) {
                fns[i](e, data);
            }
        }
    };
})(typeof window !== 'undefined' ? window : this);
PubSub.on('test', function (e, data) {
    console.log(data);
});
PubSub.trigger('test', 1);
PubSub.trigger('test', {
    a: 1
}); //{a:1}
PubSub.trigger('test', [2, 3, 4]); //[2,3,4]
PubSub.trigger('test', {
    arr: [2, 3, 4]
}); //{arr:[2,3,4]}
于 2012-08-29T08:25:42.037 に答える