如何在不丢失其他侦听器的情况下侦听变量或对象属性的值集。
例如
var myModel;
myModel = 10;
var myListener1 = function(oldVal, newVal) {
//do stuff
}
var myListener2 = function(oldVal, newVal) {
//do other stuff
}
这里我希望每当为变量myModel设置一个值时调用myListener1和myListener2。稍后在其他函数中可能还想在setter上向myModel添加另一个监听器,因此它不应该覆盖现有的监听器。
我知道应该有一种方法可以使用Object.defineProperty()。 另外,为IE8 +提供跨浏览器的解决方案也是一件好事。
答案 0 :(得分:3)
对于以下方法,您必须使用具有属性的对象,但它可以正常工作。
// this is very similar to using Object.watch()
// instead we attach multiple listeners
var myModel = (function () {
var actualValue,
interceptors = [];
function callInterceptors(newValue) {
for (var i = 0; i < interceptors.length; i += 1) {
interceptors[i](newValue);
}
}
return {
get value() {
// user never has access to the private variable "actualValue"
// we can control what they get back from saying "myModel.value"
return actualValue;
},
set value(newValue) {
callInterceptors(newValue);
actualValue = newValue;
},
listen : function (fn) {
if (typeof fn === 'function') {
interceptors.push(fn);
}
}
};
}());
// add a listener
myModel.listen(function (passedValue) {
alert('You tried to set myValue to ' + passedValue);
});
// add another listener
myModel.listen(function (passedValue) {
alert('AAARRG! Why did you modify that value to ' + passedValue + '?!?!');
});
// our functions are called when we
// modify our value
myModel.value = 10;
答案 1 :(得分:0)
仅通过函数更改myModel
的值,以便您可以在更改之后/之前运行侦听器函数。
var myModel = 10,
myListener1 = function(oldVal, newVal) {
// do stuff
},
myListener2 = function(oldVal, newVal) {
// do other stuff
},
changeMyModel = function (value) {
myListener1(myModel, value);
myListener2(myModel, value);
myModel = value;
// do more stuff
};
// changeMyModel(99) === myModel; true
OR
var change = function (value) {
myListener1(myModel, value);
myListener2(myModel, value);
return value;
};
// myModel = change(45);