我有一个对象,它会不断更改用户操作以跟踪网格,所以我认为如果对象发生变化可能会触发事件? 我知道这可以做到但是我们可以不在对象上注册事件,一旦对象发生变化,我们就可以触发调用处理对象状态的函数的事件吗?
我想出了什么工作,但每次我改变对象时都必须手动触发,我们可以坐在那里等待对象改变并采取行动吗?
$( 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及其对应的状态?
那么可以只听取对象更改事件吗?
答案 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
现在麻烦的是你必须像这样定义整个对象。然后,这只是一个地方,每当某些事情发生变化时,您都会收到通知。
但最好使用框架......