Jquery听非dom对象更改事件?

时间:2013-10-09 15:00:37

标签: javascript jquery

我有一个对象,它会不断更改用户操作以跟踪网格,所以我认为如果对象发生变化可能会触发事件? 我知道这可以做到但是我们可以不在对象上注册事件,一旦对象发生变化,我们就可以触发调用处理对象状态的函数的事件吗?

我想出了什么工作,但每次我改变对象时都必须手动触发,我们可以坐在那里等待对象改变并采取行动吗?

 $( 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 = Success,它可以扩展到无限。一旦对象发生变化,我想反映网格中的那些变化,这些变化会在网格中显示所有localnumber及其对应的状态?

那么可以只听取对象更改事件吗?

3 个答案:

答案 0 :(得分:5)

您可以将“set + trigger”包装在方法中:

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

显然,如果您希望事件始终触发,您将有责任仅通过此方法修改对象...

答案 1 :(得分:1)

  

“我们可以坐在那里等待对象改变并采取行动   ?“

是的,但这样做效率很低,你最好做你已经做过的事情。

这就是你如何做到的:

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

setInterval(checkForChanges,100);

它必须每n ms进行解析并查找更改,这可能非常昂贵。

答案 2 :(得分:0)

您必须使用Angular或Knockout等框架。

或者执行凯文B提到的setInterval技巧。

或者,如果您只使用非常现代的浏览器并且不介意麻烦,请使用属性getter。请参阅“定义getter和setter”中的ref here并在浏览器的控制台中运行以下示例(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

现在麻烦的是你必须像这样定义整个对象。然后,这只是一个地方,每当某些事情发生变化时,您都会收到通知。

但最好使用框架......