Сценарий PubSub не принимает переменные

Я нашел сценарий PubSub в Интернете, который работает довольно хорошо, к сожалению, я не совсем понимаю, как это работает ...

Это не проблема до сих пор. Для проекта мне нужно вызвать функцию через этот скрипт pubsub и передать ему некоторые события . on ( 'scrollChanged' , self . translate ); , Однако функция, похоже, не принимает никаких аргументов и только передает измененную переменную своего события.

Вот строка кода, которая подписывается на событие PubSub и вызывает функцию:

self.translate()

Как вы, вероятно, можете сказать, событие - это событие прокрутки, а переданное значение - количество прокрутки пикселей.

Эта строка находится внутри плагина jQuery, который я сейчас разрабатываю, и должен действовать как вызов функции, который мы обычно будем делать следующим образом: translate

До сих пор все работает хорошо, но initфункции также нужны некоторые другие переменные от -функции (из которой она называется). Поэтому обычно я бы написал:[...] init: function( options, this ) { // Logic self.translate(var1, var2); }, translate: function( var1, var2 ) { // Logic } [...]

events.on( 'scrollChanged', self.translate );

Чтобы обновить функцию во время прокрутки, мне нужно вызвать ее с помощью yScrollfuntion, а также передать переменную для некоторых вычислений. Но если я передаю две переменные, я получаю сообщения об ошибках, которые говорят мне, что функция не определена.// Exchanged `self.translate(var1, var2);` in the above code by: events.on( 'scrollChanged', self.translate(var1, var2) );

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);
      });
    }
  }
};

Поэтому я предполагаю, что код PubSub не принимает никаких других переменных ?!

Надеюсь, что кто-нибудь может мне помочь.


Код PubSub

emit

Ошибка возникает в этой строке функции fn:

EMIT (данные);

и говорит мне, что не определено.$(window).scroll(function(){ var yScroll = $(this).scrollTop(); events.emit('scrollChanged', yScroll); });

Вот код, .on()который работает хорошо, если аргументы не передаются:

()

javascript,jquery,

3

Ответов: 1


Код PubSub

emit

Ошибка возникает в этой строке функции fn:

EMIT (данные);

и говорит мне, что не определено.$(window).scroll(function(){ var yScroll = $(this).scrollTop(); events.emit('scrollChanged', yScroll); });

Вот код, .on()который работает хорошо, если аргументы не передаются:

()
13
0

Передать функцию функции по rest parametersвторому параметру вместо функции вызова немедленно, вызвав emit; определить spread elementкак второй параметр fn, использовать назначение destructuring, argumentsat fnдля определения argumentsпереданного fnкак массив внутри fnтела функции

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);
      });
    }
  }
};

function cb() {
  var [args] = [...arguments];
  console.log(args, args[0], args[1]); // `["abc", 123]`, `"abc"`, `123`
}

events.on("scrollChanged", cb);
events.emit("scrollChanged", "abc", 123);

JavaScript, JQuery,
Похожие вопросы