Knockout.js 用数组敲除复选框?
我知道这个话题已经讨论过好几次了,但我在这里遇到了一些麻烦。我认为:Knockout.js 用数组敲除复选框?,knockout.js,Knockout.js,我知道这个话题已经讨论过好几次了,但我在这里遇到了一些麻烦。我认为: <!-- ko foreach: documents --> <div> <input type="checkbox" data-bind="checked: $parent.checkItem(documentId)" /> </div> <!-- /ko --> 我使用Windows是因为另一个资源需要访问此阵列
<!-- ko foreach: documents -->
<div>
<input type="checkbox" data-bind="checked: $parent.checkItem(documentId)" />
</div>
<!-- /ko -->
我使用Windows是因为另一个资源需要访问此阵列
现在,当我加载页面时,每个文档的checkItem都会被点击一次,我认为这是不应该的。我试图监视已选择的文档,保持数组更新(在本例中为selectedDocuments)
下面是我的尝试:
我怎样才能做到这一点呢?我认为您需要做的就是使用一个
选中的数据绑定到可观察数组。当您检查项目时,Knockout将自动更新可观察数组
还要注意,我添加了一个value
绑定,将每个复选框的value
绑定到documentId
查看:
示例:
作为旁注,如果可能的话,我会避免将属性附加到窗口。您可以使用a或。您将需要根据可观察或可观察的阵列绑定您的选中的绑定。当绑定到一个数组时,将选中
绑定,并从数组中添加和删除输入的值
因此,在您的例子中,您可以将输入的值
与documentId和数组绑定,这将产生一个id数组。然后,您可以使用computed创建由这些ID表示的文档的数组
var viewModel = {
documents: [{"documentId": "2"}, {"documentId": "3"}, {"documentId": "1"}],
selectedDocumentIds: ko.observableArray()
};
//quick index to make lookup require less looping
viewModel.documentIndex = {};
ko.utils.arrayForEach(viewModel.documents, function(doc) {
viewModel.documentIndex[doc.documentId] = doc;
});
//computed to represent an array of the actual objects
viewModel.selectedDocuments = ko.computed(function() {
return ko.utils.arrayMap(viewModel.selectedDocumentIds(), function(id) {
return viewModel.documentIndex[id];
});
});
此处示例:
哇,太棒了。谢谢安德鲁。“如果可能的话,我会尽量避免将属性附加到窗口。”-为什么?再次感谢你,伙计。我刚刚尝试实现了pub/sub,我非常接近于让它工作,若你们有时间,我会在这里发布问题:
<!-- ko foreach: documents -->
<div>
<input type="checkbox" data-bind="checked: $parent.selectedDocuments, value: documentId" />
</div>
<!-- /ko -->
<!-- ko foreach: selectedDocuments -->
<div>
<span data-bind="text: $data"></span>
</div>
<!-- /ko -->
var selectedDocuments = ko.observableArray();
var viewModel = {
documents: [{"documentId": "1"}, {"documentId": "2"}, {"documentId": "3"}],
selectedDocuments: selectedDocuments
};
ko.applyBindings(viewModel);
var viewModel = {
documents: [{"documentId": "2"}, {"documentId": "3"}, {"documentId": "1"}],
selectedDocumentIds: ko.observableArray()
};
//quick index to make lookup require less looping
viewModel.documentIndex = {};
ko.utils.arrayForEach(viewModel.documents, function(doc) {
viewModel.documentIndex[doc.documentId] = doc;
});
//computed to represent an array of the actual objects
viewModel.selectedDocuments = ko.computed(function() {
return ko.utils.arrayMap(viewModel.selectedDocumentIds(), function(id) {
return viewModel.documentIndex[id];
});
});