2013-10-09 129 views
2

我有一個對象在用戶操作中不斷進行更改以跟蹤網格,所以我認爲只要對象發生更改就可能觸發事件。 我知道這是可以做到的,但是我們可以不在對象上註冊事件,只要對象發生變化,我們可以觸發調用處理對象狀態的函數的事件?jquery聽非DOM對象更改事件?

我已經想出了一些作品,但每次我改變對象時都必須手動觸發,我們可以坐在那裏等待對象改變並採取行動嗎?

$(requestProcessStatus).trigger ("valueChanged"); // trigger this each time object changes` 

$(requestProcessStatus).bind("valueChanged", function() { 
console.log("object changed"); 
}); // do whatever in here 


requestProcessStatus : { 
    RequestNumber : '', 
    ProcessStatus : '', 
    LoanTrackingInfo : [ 
     LocalNumber: '', 
     ProcessStatus: '' 
    ] 
}, 

我有這樣的對象,並且一旦用戶進入LocalNumber在文本框我火了ajax請求信息,如果響應是成功的LoantrackingInfo數組會隨着LocalNumber和proccessStatus =成功填充並且它可以擴展高達無限。只要對象發生變化,我想反映我的網格中顯示網格中所有localnumber及其相應狀態的更改。

那麼是否有可能只聽對象更改事件?

+1

*「可我們只是坐在那裏,在它等待的對象改變和行爲嗎?」 *是的,但它是非常低效的,你最好做你現在在做什麼。 –

+1

「所以只能聽對象/改變事件纔有可能?」這不是一個海雀嗎? :) – LeGEC

+0

這就是要走的路。如果你想要一個更可讀/整潔的方法,請選擇一個框架,如[Backbone。JS](http://backbonejs.org/)。 – moonwave99

回答

4

你可以換行「設置+觸發」的方法中:

requestProcessStatus.setVal = function(attr, value){ 
    this[attr] = value; 
    $(this).trigger('valueChanged'); 
} 

很顯然,你將有責任,如果你希望事件總是觸發只能通過這種方法修改的對象...

+0

我喜歡在一個地方調用觸發器和設置值的想法+1 – inputError

1

「我們可以坐在那裏等待對象改變,並採取行動 ?」

是的,但它會非常低效,你最好不要做你已經做的事情。

這是你會怎麼做,但:

previousObjectState = {}; 
function checkForChanges() { 
    // iterate over object looking for changes 
    if (changes happened) { 
     $(theObject).trigger("change"); 
    } 
    previousObjectState = $.extend(true,{},theObject); 
} 

setInterval(checkForChanges,100); 

那就要分析和尋找變化每n毫秒,這可能是非常昂貴的。

+0

那我不會去,我想我可以繼續我在做什麼,如果是這種情況..感謝凱文+1爲您的建議 – inputError

0

你將不得不使用像角或淘汰賽的框架。

還是做setInterval伎倆,由Kevin B.

提到

或者,如果你只使用真正的現代瀏覽器,不介意的麻煩,使用屬性的getter。見文here在「定義getter和setter」,並運行在瀏覽器的控制檯下面的例子(從JS迴應與>開始):

a={} 
Object.defineProperty(a,"x",{ 
    get:function(){ return 5; }, 
    set:function(v){ console.log(v); } 
}) 
a.x 
> 5 
a.x = 9 
> 9 
a.x 
> 5 

現在的麻煩是,你必須定義一樣,整個對象。然後,這只是一個地方,每次有變化,你都會得到通知。

但最好用一個框架...