Knockout.js 使用progressbar和knockout处理viewmodels的可观察数组

Knockout.js 使用progressbar和knockout处理viewmodels的可观察数组,knockout.js,Knockout.js,我试图弄清楚如何在服务器上自动处理一些viewmodels的可观察数组,并让它逐个更新jquery ui progressbar,我想出了以下代码:) ko.bindingHandlers.progressBar={ init:函数(元素、valueAccessor、allBindings、viewModel、bindingContext){ var value=valueAccessor(); $(元素).progressbar({ 值:false, max:ko.展开(value.max)

我试图弄清楚如何在服务器上自动处理一些viewmodels的可观察数组,并让它逐个更新jquery ui progressbar,我想出了以下代码:)


ko.bindingHandlers.progressBar={
init:函数(元素、valueAccessor、allBindings、viewModel、bindingContext){
var value=valueAccessor();
$(元素).progressbar({
值:false,
max:ko.展开(value.max)
});
},
更新:函数(元素、valueAccessor、allBindings、viewModel、bindingContext){
var value=valueAccessor();
$(元素).progressbar(“选项”,“值”,ko.unwrap(value.value));
}
}
功能视图模型(模型){
var self=这个;
fromJS(JSON.parse(model),{},self);
self.progressValue=ko.可观察值(0);
ko.computed(函数(){
如果(self.ViewModels().length>0){
var first=self.ViewModels()[0];
$.ajax({
//在服务器上发送第一个viewmodel并对其进行处理
成功:功能(结果){
self.ViewModels.remove(首先);
self.progressValue(self.progressValue()+1);
}
});
}
})
}
当递归调用compute时,您如何看待这种方法?也许你看不到任何实际用途,但如果,你会怎么做呢?

文档说:

敲除将不会重新开始对已计算的进行求值

所以如果它真的是递归的,你的方法就会有问题

但在您的例子中,它不是真正的递归,因为只有在服务器在单独的执行堆栈中响应(异步)时才会调用
success
回调

所以我认为你的方法很好,假设它提供了你想要的功能

如果不使用计算函数,一种更简单的方法是将其放入函数中,然后从成功回调调用该函数:

        self.progressValue = ko.observable(0);

        sendRemaining();

        function sendRemaining() {    
            if (self.ViewModels().length > 0) {
                var first = self.ViewModels()[0];
                $.ajax({
                    //send first viewmodel on server and do something with it
                    success: function (result) {
                        self.ViewModels.remove(first);
                        self.progressValue(self.progressValue() + 1);
                        sendRemaining();
                    }
                });
            }
        }    

感谢您的回答和关于计算观察值中递归的说明,另外一种方法是使用subscribe-to-array,但正如您所说的,只使用函数更简单
        self.progressValue = ko.observable(0);

        sendRemaining();

        function sendRemaining() {    
            if (self.ViewModels().length > 0) {
                var first = self.ViewModels()[0];
                $.ajax({
                    //send first viewmodel on server and do something with it
                    success: function (result) {
                        self.ViewModels.remove(first);
                        self.progressValue(self.progressValue() + 1);
                        sendRemaining();
                    }
                });
            }
        }