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];
    });
});