Knockout.js 使用progressbar和knockout处理viewmodels的可观察数组
我试图弄清楚如何在服务器上自动处理一些viewmodels的可观察数组,并让它逐个更新jquery ui progressbar,我想出了以下代码:)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)
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();
}
});
}
}