2015-10-30 4 views
2

Я хочу написать пользовательское событие и печать на консоль obj.name в функцию обратного вызоваJavascript пользовательские события изменения аргумент обратного вызова

Но я получаю сообщение об ошибке, и нужно, чтобы получить OBJ имя как obj.detail.context.name

Как я могу решить это и печать с помощью obj.name строки коды вместо obj.detail.context.name

в настоящее время strucure из OBJ в обратном вызове:

obj 

CustomEvent { isTrusted: ложные } пузырей: ложные cancelBubble: ложные отменяемые: ложные currentTarget: WindowdefaultPrevented: ложная деталь: Объект EventPhase: 2isTrusted: falseisTrusted: falsepath: Array [1] ReturnValue: truesrcElement: Windowtarget : WindowtimeStamp: 1446215160435type: «есть: сделано» прото: CustomEvent

+0

вы можете предоставить jsfiddle? – Grundy

ответ

2

Вы могли бы увеличить в event object с пользовательскими атрибутами (слияние с lodash или сделать это самостоятельно). Следующий пример, возможно, дает вам некоторое представление;

// define the event 
var event = new CustomEvent('test'); 
// add your custom arguments 
event.customAttr = 'foo'; 
//the listener 
window.addEventListener('test', function (e) {console.log(e)}); 
// fire it 
window.dispatchEvent(event); 
// logs: CustomEvent {isTrusted: false, customAttr: "foo"} 
1

При регистрации пользовательского события возвращаемое значение при его запуске имеет тип CustomEvent.

Эта путаница также проявляется в вашем наименовании. Вместо того, чтобы:

MyEventsManager.on('eat:done', function(person){}); 

Вы фактически получаете:

MyEventsManager.on('eat:done', function(event){}); 

Если вы хотите использовать CostumEvents, это единственный способ (Вы не можете использовать пользовательские события без использования объекта CustomEvent).

Возможно, вы ищете что-то более простое, как менеджер обратного вызова:

function EventsManager(){ 
    var callbacks = {}; 
    return { 
     on: function(eventName, callback, context){ 
      if(callbacks[eventName]) 
       callbacks[eventName].push(callback.bind(context)); 
      else 
       callbacks[eventName] = [callback.bind(context)]; 
     }, 

     trigger: function(eventName, data){ 
      for(var i=0; callbacks[eventName] && i < callbacks[eventName].length; i++) 
       callbacks[eventName][i](data); 
     } 
    } 
} 
Смежные вопросы