【发布时间】:2020-12-23 17:49:27
【问题描述】:
这里是小提琴:https:https://jsfiddle.net/t5v7fmoq/1/
我想要达到的目标:
我希望能够根据收到的状态变量(可以有真值或假值)自动更新复选框视图
三个复选框的状态变量(带有初始状态)是:
self.state1 = ko.observable(true);
self.state2 = ko.observable(false);
self.state3 = ko.observable(true);
在初始化函数中我填充 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 函数中,我设置了 observable 属性和 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)
但这并没有按预期工作。
简而言之,我想了解对行为进行编码的编码方法,以便在从服务器接收到新状态时,将正确的状态应用于正确的复选框,并正确更新正确的复选框视图。
【问题讨论】:
-
您的复选框值基于
Item.state显示。为什么需要ViewModel中的state1、state2和itemStatus属性?您始终可以使用availableItems访问它们,就像在activeItemss中所做的那样。 -
如何从服务器保存和获取数据?它基于
id字段? -
因为 state1、state2 和 state3,我在真实代码中模拟一种情况,我从服务器接收数据,使用 ko.js mapp 插件映射
-
但是,为什么需要多个连续编号的状态属性?复选框状态在
Item对象内。为什么需要ViewModel中的重复信息。当发生变化时,您需要更新这两个地方。即使您从服务器获取数据,您也有id参数来确定要更新哪个复选框? -
这是因为我无法控制来自服务器端的内容。在这种情况下我将如何编码?你有什么建议?
标签: javascript arrays mvvm knockout.js observable