下面是小提琴:https:https://jsfiddle.net/t5v7fmoq/1/
我想实现的目标:
我希望能够根据接收到的状态变量(可以有真值或假值)自动更新复选框视图
三个复选框的状态变量(具有初始状态)为:
self.state1 = ko.observable(true);
self.state2 = ko.observable(false);
self.state3 = ko.observable(true);
在init函数中,我填充了observablearray:
self.init = function() {
self.availableItems([
new Item(1, "item1", self.state1(), self.onItemStateChange),
new Item(2, "item2", self.state2(), self.onItemStateChange),
new Item(3, "item3", self.state3(), self.onItemStateChange)
]);
在Item函数中,我设置了可观察属性和onChnage方法:
function Item(id, name, state, onChange) {
var self = this;
self.id = ko.observable(id);
self.name = ko.observable(name);
self.state = ko.observable(state);
self.state.subscribe(function(newValue) {
onChange(self, newValue);
});
}
使用setTimeout,我伪造了一个一次性 AJAX 调用,它设置了新的状态:
setTimeout(()=>{
self.state1(false)
self.state2(true)
self.state3(false)
self.availableItems()[0].state(self.state1())
self.availableItems()[1].state(self.state2())
self.availableItems()[2].state(self.state3())
},1000)
但是,我想实现的是,我想避免键入以下内容:
self.availableItems()[0].state(self.state1())
self.availableItems()[1].state(self.state2())
self.availableItems()[2].state(self.state3())
我想用通用的方法和最佳的编码来编码这种行为和跟踪这种状态......我不知道如何以不同的方式处理这个问题。
我尝试使用如下数组(这样以后我就可以使用forach和索引):
setTimeout(()=>{
self.state1(false)
self.state2(true)
self.state3(false)
self.availableItems()[0].state(self.itemStatus()[0])
self.availableItems()[1].state(self.itemStatus()[1])
self.availableItems()[2].state(self.itemStatus()[2])
},1000)
但这并不像预期的那样起作用。
简而言之,我想学习什么样的编码方法来编码行为,以便当从服务器接收到新状态时,正确的状态被应用到正确的复选框,并且正确的复选框视图被正确更新。
1条答案
按热度按时间6yt4nkrj1#
一般道理:如果你创建了编号变量(
item1
,item2
,item3
),你就做错了。使用数组。根据从服务器获取状态更新的方式,
updateState
的实现需要改变。我下面的实现假设您获取的是一个布尔值数组,例如[true, true, false]
。最好让视图模型接受一个
params
对象,并用它初始化自己,下面的代码就是这样做的。第一个