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);