knockout.js 如何在ko.js中跟踪多个复选框的状态更改

2exbekwf  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(120)

下面是小提琴: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)

但这并不像预期的那样起作用。
简而言之,我想学习什么样的编码方法来编码行为,以便当从服务器接收到新状态时,正确的状态被应用到正确的复选框,并且正确的复选框视图被正确更新。

6yt4nkrj

6yt4nkrj1#

一般道理:如果你创建了编号变量(item1item2item3),你就做错了。使用数组。
根据从服务器获取状态更新的方式,updateState的实现需要改变。我下面的实现假设您获取的是一个布尔值数组,例如[true, true, false]
最好让视图模型接受一个params对象,并用它初始化自己,下面的代码就是这样做的。
第一个

相关问题