Javascript 淘汰中多个观测值的分配超时/中断
在这一点上请容忍我,因为这一点对我来说有点难以解释。 所以我分配了多个观测值,比如:-Javascript 淘汰中多个观测值的分配超时/中断,javascript,knockout.js,settimeout,Javascript,Knockout.js,Settimeout,在这一点上请容忍我,因为这一点对我来说有点难以解释。 所以我分配了多个观测值,比如:- var self = this; self.amount = ko.observableArray(); self.data0 = ko.observable([10,11,12]); self.data1 = ko.observable([1,2,3]); self.data2 = ko.observable([3,4,5]); self.data3 = ko.observable([6,7,8]); se
var self = this;
self.amount = ko.observableArray();
self.data0 = ko.observable([10,11,12]);
self.data1 = ko.observable([1,2,3]);
self.data2 = ko.observable([3,4,5]);
self.data3 = ko.observable([6,7,8]);
self.data4 = ko.observable([9,10,11]);
还有一个按钮,可以通过下面的函数改变每个函数的值(这个函数所做的并不重要,它只是显示在可观察对象中有一些变化)
我的代码不应该首先绑定self.data0吗?它不应该立即反映在我的UI上吗?目前,我只能一次看到所有的变化,这不是我想要的行为
下面是我要做的事情的答案。(单击“填充/更改”以填充数据,并在填充后对其进行更改…然后在UI端进行变异以查看更改。如果在单击“变异”按钮之前检查控制台,当您按下“填充/更改”按钮时,您还可以看到数据确实在更改)超时的关键是使用IEFE(立即调用的函数执行)捕获闭包中的循环值(i和J)
for(var j=0,len=self['data'+i]()。长度;j
我已经创建了一个小提琴来显示它的工作,你只需要1个按钮来显示它。我刚刚让第二个按钮单独更新每个项目,而不是像第一个按钮那样更新数组中的所有值
希望有帮助。当填充数据时,将立即看到UI端的更改。因为您正在将数据绑定到UI这是敲除的优势。我确实希望显示更改,但如果您查看我的代码,我会一次绑定一个可见的更改(在
while
中循环timeout
。首先self.data0
,然后self.data1
,然后是self.data2..你明白了。我希望UI也这样做。在单个函数调用中一次反映一个更改,而不是一次反映所有更改。首先,settimeout与timeout一起使用,timeout为1000。这意味着,e一切都将在1秒后执行。可能你想在超时fn中添加i*1000。其次,bindOneByOne没有任何超时,所以它只是填充数据,因为它被绑定了,它会自动反映出来。omg。是的!!谢谢你。我完全忘记了超时时的i*1000。我一直在尝试让这个东西工作2天现在,bindOneByOne正在做我想做的事。
self.bindOneByOne = function(){
var self = this;
var i = 0;
while(self['data' + i]){
for(var j = 0, len = self['data'+i]().length; j < len; j++){
self['data'+i]()[j] *= 2;
}
self.amount.push(i);
i++;
}
};
self.changeValues = function(){
var i = 0;
while(self['data' + i]){
setTimeout(self['data' +i].valueHasMutated,1000);
i++;
}
}
for(var j = 0, len = self['data'+i]().length; j < len; j++){
(function(){
//this captures the item to set using the current value of i and J
var itemToSet = self['data'+i]()[j];
setTimeout(function(){
console.log('itemToSet',itemToSet());
itemToSet(itemToSet() * 2);
},1000*(i+1));
})() //the () brackets immediately invoke this function that is also in brackets
}
self.amount.push(i);