我在互联网上找到了一个PubSub脚本,效果很好,不幸的是我不完全理解它是如何工作的......
直到现在这还不是问题。对于一个项目,我需要通过这个pubsub脚本调用一个函数并传递一些参数。但是,该函数似乎不接受任何arguemnts,只传递其事件的更改变量。
以下是订阅PubSub事件并调用函数的代码行:
events.on( 'scrollChanged', self.translate );
正如您所知,事件是一个滚动事件,传递的值是滚动的像素数。
这一行代表一个jQuery插件,我目前正在开发它并且应该充当函数调用,我们通常会这样:self.translate()
到目前为止,一切运行良好,但translate
函数还需要来自init
- 函数(从中调用它)的一些其他变量。
通常我会写:
[...]
init: function( options, this ) {
// Logic
self.translate(var1, var2);
},
translate: function( var1, var2 ) {
// Logic
}
[...]
要在滚动时更新功能,我需要使用events.on( 'scrollChanged', self.translate );
功能调用它,并传递yScroll
变量进行某些计算。但是,如果我将两个变量传递给它,我只会收到错误消息,告诉我该函数未定义。
// Exchanged `self.translate(var1, var2);` in the above code by:
events.on( 'scrollChanged', self.translate(var1, var2) );
所以我猜,PubSub代码不接受任何其他变量?!
希望有人能帮助我。
PubSub代码
var events = {
events: {},
on: function (eventName, fn) {
this.events[eventName] = this.events[eventName] || [];
this.events[eventName].push(fn);
},
off: function(eventName, fn) {
if (this.events[eventName]) {
for (var i = 0; i < this.events[eventName].length; i++) {
if (this.events[eventName][i] === fn) {
this.events[eventName].splice(i, 1);
break;
}
};
}
},
emit: function (eventName, data) {
if (this.events[eventName]) {
this.events[eventName].forEach(function(fn) {
fn(data);
});
}
}
};
错误发生在emit
- 函数的这一行:
FN(数据);
告诉我,fn
未定义。
如果没有传递任何参数,那么emit
的代码效果很好:
$(window).scroll(function(){
var yScroll = $(this).scrollTop();
events.emit('scrollChanged', yScroll);
});
答案 0 :(得分:0)
在第二个参数处将函数引用传递给.on()
,而不是通过调用()
立即调用函数;将rest parameters
定义为emit
的第二个参数,使用spread element
处的解构分配fn
来定义传递给arguments
的{{1}}作为fn
内的数组{1}}功能正文
fn