通过jQuery tiny PubSub传递数组
传递原始值或对象时, jQuery tiny 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]}
我已经看到了它的一些改进版本,它主要关注缓存订阅者,但它们都不能传递数组。 那么,有两个问题:
- 通过PubSub传递数组是个好主意吗?
- 怎么做?
您不能在数组上使用apply函数。 您只能使用apply和调用对象实例。
数组可以在每个索引中包含对象。
好吧,我还是弄清楚了。
甚至认为它对其他人来说可能不是问题,但是不能通过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]}