@Forum3

Javascript: библиотека отлова событий объектов ?

Добрый день.
Посоветуйте библиотека, позволяющую имитировать event у объектов и подписываться на них.
К примеру: у нас есть объект, к нему добавляются методы on/off/trigger, он в методах вызывает trigger, а мы отлавливаем это
Примерный синтаксис:
var newObject.prototype = {...}
newObject.extend(Events);

var test = new newObject();
test.on('событие', function() {
    // pass
})


Подобное есть в underscore(extend) и Backbone(events), может кто-то знает такую библиотеку? Нужно именно отдельную библиотеку, т.к. copy-paste или свой велосипед не приветствуется Используется для сборки bower и grunt, а подключать Backbone как-то не выгодно по ресурсам
  • Вопрос задан
  • 2407 просмотров
Пригласить эксперта
Ответы на вопрос 4
@Elizavetta
Matroid: gamedev/js-разработка
Может быть что-то типа этого millermedeiros.github.io/js-signals
Ответ написан
Сами напишите. Десяток-другой строк в простейшей реализации. С готового, не знаю почему, первым в голову пришел eddy.
Ответ написан
Комментировать
MarcusAurelius
@MarcusAurelius
автор Impress Application Server для Node.js
А чем не подходит EventEmitter?

var events = require('events');
var test = new events.EventEmitter(); 
test.on('событие', function() {});
test.emit('событие');
Ответ написан
mlnkv
@mlnkv
JavaScript Developer
самый простой вариант:
function observable(el) {
    var callbacks = {}, slice = [].slice;

    el.on = function(events, fn) {
      if (typeof fn === "function") {
        events.replace(/\S+/g, function(name, pos) {
          (callbacks[name] = callbacks[name] || []).push(fn);
          fn.typed = pos > 0;
        });
      }
      return el;
    };

    el.off = function(events, fn) {
      if (events === "*") callbacks = {};
      else if (fn) {
        var arr = callbacks[events];
        for (var i = 0, cb; (cb = arr && arr[i]); ++i) {
          if (cb === fn) { arr.splice(i, 1); i--; }
        }
      } else {
        events.replace(/\S+/g, function(name) {
          callbacks[name] = [];
        });
      }
      return el;
    };

    // only single event supported
    el.one = function(name, fn) {
      if (fn) fn.one = true;
      return el.on(name, fn);
    };

    el.trigger = function(name) {
      var args = slice.call(arguments, 1),
        fns = callbacks[name] || [];

      for (var i = 0, fn; (fn = fns[i]); ++i) {
        if (!fn.busy) {
          fn.busy = true;
          fn.apply(el, fn.typed ? [name].concat(args) : args);
          if (fn.one) { fns.splice(i, 1); i--; }
          fn.busy = false;
        }
      }

      return el;
    };

    return el;
  };


var my_obj = {};
observable(my_obj);
my_obj.on("update", function() { /*  */ });
my_obj.trigger("update");


Отсюда https://muut.com/riotjs/
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы