【发布时间】:2019-05-02 12:43:46
【问题描述】:
我正在使用 knockout.js foreach 循环创建一个复选框列表。我有一个可观察的数组来保存复选框的值,但是当我调用函数来检查它们的值时,this 元素指的是父元素,即 viewModel。如何访问与单击的元素相关的数组元素?
我已尝试从以下代码中删除 $parent 引用,但这会引发此错误:Message: getSampleValue is not defined
这是创建复选框的 foreach 循环:
<!-- ko foreach: sampleList -->
<div data-bind="css: { hasValue: $parent.getSampleValue() }">
<span data-bind="click: $parent.sampleClick, text: name"></span>
<div data-bind="click: $parent.sampleClick" class="spot fa fa-square"></div>
</div>
<!-- /ko -->
这些是 ko 视图模型中定义的函数:
sampleViewModel = function (data) {
var self = this;
self.sampleList = ko.observableArray(data.sampleList);
self.sampleClick = function () {
this.isChecked = !this.isChecked;
}
self.getSampleValue = function () {
return this.isChecked;
}
}
而sampleList的格式是:
{
{
"name": "name1",
"isChecked": false
},
{
"name": "name2",
"isChecked": true
}
}
预期结果:当数组中给定项的 isChecked 值发生更改并且应该更新 UI 上的值时,应调用函数 getSampleValue。从该函数返回的 isChecked 值应该是数组中正确的元素,而不是父元素。
实际结果:该函数被调用,但似乎仅在创建复选框时调用,而不是在更新 isChecked 值时调用,并且函数内的 this 是调用者的父元素,因此没有isChecked 值。
非常感谢您提供任何帮助。
编辑: 所以改变这一行:
<div data-bind="css: { hasValue: $parent.getSampleValue() }">
到这里:
<div data-bind="css: { hasValue: isChecked }">
似乎在加载时显示正确的值,但即使可观察数组的值正在更改,它们仍然不会在 UI 上更新。
【问题讨论】:
标签: knockout.js