JavaScript-反应性
我有这个密码。它总是这样做,当会话中存在对某个键感兴趣的函数时,每当该键更改其值时,就会调用该函数。 问题是,为了跟踪函数感兴趣的键,我需要运行该函数一次,它可能会产生一些副作用(例如,如果该函数将操作DOM)。如果可能的话,如何在不影响当前环境的情况下运行该功能JavaScript-反应性,javascript,Javascript,我有这个密码。它总是这样做,当会话中存在对某个键感兴趣的函数时,每当该键更改其值时,就会调用该函数。 问题是,为了跟踪函数感兴趣的键,我需要运行该函数一次,它可能会产生一些副作用(例如,如果该函数将操作DOM)。如果可能的话,如何在不影响当前环境的情况下运行该功能 var checkRunning = false; var keys = []; var checks = {}; var Session = { get: function (key) { if (checkRunni
var checkRunning = false;
var keys = [];
var checks = {};
var Session = {
get: function (key) {
if (checkRunning) {
keys.push(key);
}
},
set: function (key, value) {
if (checks[key]) {
var l = checks[key].lenght;
for (var i = 0; i < l; i++) {
checks[key][i]();
}
}
}
};
function check(f) {
checkRunning = true;
f();
checkRunning = false;
var l = keys.lenght;
for (var i = 0; i < l; i++) {
if (checks[keys[i]]) {
checks[keys[i]].push(f);
}
else {
checks[keys[i]] = [f];
}
}
keys = [];
}
//how to use
var a = "something";
check(function () {
// this function should be run always when Session key "a_dep" will change
a = Session.get("a_dep");
});
Session.set("a_dep", 10);
Session.set("a_dep", 20);
var checkRunning=false;
var键=[];
var检查={};
var会话={
获取:函数(键){
如果(检查运行){
按键。按(键);
}
},
设置:功能(键、值){
如果(选中[键]){
var l=检查[键]。长度;
对于(变量i=0;i
所以我重构了您的代码,以实现我理解的您想要的
我首先重新定义了会话及其getter/setter。我将值存储在文本对象中,并使用键访问它:
function Session () {
this.myDictionnary = {};
this.myCallbacks = {};
}
Session.prototype.set = function (key, value) {
this.myDictionnary[key] = value;
}
Session.prototype.get = function (key) {
return this.myDictionnary[key];
}
这里有我们的核心代码。现在,您希望在每次为键设置值时调用函数,因此我们必须
myCallbacks
literal对象,它将处理这些对。首先,创建键-函数耦合:
Session.prototype.callbackWhenSet = function (key, callback) {
if(!this.myCallbacks[key]) {
this.myCallbacks[key] = [];
}
this.myCallbacks[key].push(callback);
}
然后在调用set时调用它(这里我重写了set
函数)
如您所见,每次设置“a_dep”时,我们都会显示一个警报。或者您可以使用并执行以下操作:
var obj = ProAct.prob({
a: 4
});
obj.p('a').on(function () {
console.log('obj.a has changed!');
});
如果我是你,我会处理这个物体。看看这个@TolgahanAlbayrak:仅在Gecko中实现……您可以在这里找到对象监视垫片:
var test = new Session();
test.callbackWhenSet("a_dep", function () {
alert("a_dep is set to " + test.get("a_dep"));
});
test.set("a_dep", 10);
test.set("something", 250);
test.set("a_dep", 20);
var obj = ProAct.prob({
a: 4
});
obj.p('a').on(function () {
console.log('obj.a has changed!');
});