2011-12-01 87 views
0

在.NET中,您可以將多個處理程序添加到對象聲明爲事件的事件中。非DOM對象的JavaScript事件處理(註冊多個處理程序)

在JavaScript中處理非DOM對象的推薦方式是什麼?

即我有一個對象:

var ProblemDomainObj = {} ; 
ProblemDomainObj.Changed = function() {} ; 
ProblemDomainObj.Data = { somedata : "initialized" } ; 
ProblemDomainObj.Operate = function (newdata) { 
    if (newdata != somedata && ProblemDomainObj.IsValid(newdata)) { 
     somedata = newdata; 
     ProblemDomainObj.Changed(); 
    } 
} ; 

現在其他對象可能要註冊到知道數據已發生變化,每個想要做這樣的事情:

ProblemDomainObj.Changed += function() { 
    /* Do stuff to reflect the object model changes */ 
} ; 

如果每個獲得註冊他們的處理程序而不覆蓋另一個。

然後一些對象會調用ProblemDomainObj.Operate(foo);,所有已訂閱的人都會收到通知。

我在jQuery中找到了http://api.jquery.com/on/的文檔,但它似乎與像onclick這樣的DOM事件有關。這些都不一定與DOM有關。

+0

你寫C#中的JavaScript。您可能想要退後一步並完全學習JavaScript – Raynos

+0

@Raynos JavaScript中是否存在原生習慣,否定了訂閱對象事件的需要,以便您可以將組件解耦以瞭解其他組件,以瞭解想要了解有關它們引發的事件的其他組件? –

+0

不,但寫一個是10行,如圖所示 – Raynos

回答

3

jQuery對常規對象也很棒:http://jsfiddle.net/gMNkg/

var ProblemDomainObj = {}; 

ProblemDomainObj.Data = { somedata : "initialized" }; 

ProblemDomainObj.Operate = function() { 
    $(ProblemDomainObj).trigger("foo"); // run bound functions 
}; 


// bind 2 functions 

$(ProblemDomainObj).on("foo", function() { 
    alert(123); 
}); 

$(ProblemDomainObj).on("foo", function() { 
    alert(456); 
}); 


ProblemDomainObj.Operate(); 
1

下面是使用封閉

ProblemDomainObj.Changed = (function(previousChangeEvent) { 
    return function() { 
     if (previousChangeEvent) { 
      previousChangeEvent(); 
     } 
     /* Do stuff to reflect the object model changes */ 
    } 
})(ProblemDomainObj.Changed) ; 
2
function PubSub() { 
    return { 
     events: {}, 
     sub: function (event, handler) { 
      if (!this.events[event]) { 
       this.events[event] = [];  
      } 
      this.events[event].push(handler); 
     }, 
     pub: function (event, data) { 
      this.events[event] && this.events[event].forEach(publishData); 

      function publishData(handler) { 
       handler(data); 
      }; 
     } 
    }; 
} 

var pubsub = PubSub(); 
pubsub.sub("changed", f); 
pubsub.sub("changed", g); 
pubsub.pub("changed", o); 

你基本上要一個微小的事件系統,你可以說:「我想訂閱此事件」和「我要發佈此事件」的一種方式。

我建議你寫自己的小事件系統。

您必須將此對象集成到您的系統中。它可能最適合作爲混合使用。

2

假設您使用jQuery,您可以在任何對象上添加自定義事件。

var obj = {a:1,b:2}; 
$(obj).on('changed', function() { alert('Changed once'); }); 
$(obj).on('changed', function() { alert('Changed twice'); }); 

$(obj).trigger('changed'); 

Run the code

相關問題