@FlatUser

Как создать слушатель событий в jquery классе?

Что нужно? У меня есть объект vars в классе App, в нём лежит свойство active .
var App = function (options) {
  var vars = {
    active: false
  };

  var root = this;

  this.construct = function (options) {
    $.extend(vars, options);
  };

  this.on = function () {

  }

  this.construct(options);
};

  var app = new App();

Что нужно проделать для того чтобы правильно реализовать метод this.on?
Мне нужно сделать слушатель на active, чтобы коллбэк вызывался при vars.active === true.
Примерно так.
app.on( "active", function() {
  console.log('Приложение активно');
});

Я знаю что это можно делать с html элементами по типу
$( "button" ).on( "click", , function() {
  console.log('Button clicked');
});


Мне нужно идентичный только с реализацией в классе. Как данное реализовать?
  • Вопрос задан
  • 423 просмотра
Решения вопроса 1
@FlatUser Автор вопроса
То что подходило бы мне не нашёл, решил написать свою библиотеку.
https://github.com/itmor/events-js
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
john36allTa
@john36allTa
alien glow of a dirty mind
Создать "кастомный" слушатель не проблема, проблема в том что Вам нужно самому контролировать процесс или, другими словами, "диспатчить ивент"
var event = new Event('build');

// Listen for the event.
elem.addEventListener('build', function (e) { /* ... */ }, false);

// Dispatch the event.
elem.dispatchEvent(event);

В вашем случае можно добавить метод activate, который будет менять флаг и "диспатчить ивент"
В jquery это делается так:
$( document ).trigger( "myCustomEvent", [ "bim", "baz" ] );

Почитать можно тут про js и тут про jQuery

Если вы не можете вешать такое событие глобально и нужно привязать именно к экземпляру класса, то просто реализуйте шаблон наблюдателя для класса.
Пример грубой реализации:
var events=[];
this.on = function (event, callback) {
	events.push({e: event, fn: callback});
}
this.activate = function (){
	vars.active=true;
	for(let e of events) 
		if (e.e==='active') e.fn.apply(this)
}


И можно ещё посмотреть в сторону react или что попроще - vuejs, там такое реализовано на отличном уровне.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 06:06
1500 руб./в час
22 нояб. 2024, в 06:04
1 руб./за проект
22 нояб. 2024, в 03:54
1500 руб./за проект