Javascript 击倒可观测阵列。在多个视图模型之间共享

Javascript 击倒可观测阵列。在多个视图模型之间共享,javascript,knockout.js,Javascript,Knockout.js,在多个视图模型中共享一个淘汰的可观测阵列时遇到了一些难题 基本上,我有一个布局如下 Transport ... textbox fields, etc Selected Passengers: <!-- ko foreach: allPassengers --> <input type="checkbox" /> <!-- /ko --> <button>Add Tr

在多个视图模型中共享一个淘汰的可观测阵列时遇到了一些难题

基本上,我有一个布局如下

Transport
    ... textbox fields, etc

    Selected Passengers:
        <!-- ko foreach: allPassengers -->   
        <input type="checkbox" />
        <!-- /ko -->

    <button>Add Transport</button>

Holiday
    ... textbox fields, etc

    Selected Passengers:

        <!-- ko foreach: allPassengers -->   
        <input type="checkbox" />
        <!-- /ko -->

    <button>Add Holiday</button>
但是,单击“添加运输/假日”时,我需要一种方法来确定选中的复选框,以便添加所选乘客

我曾尝试将
checked=ko.observable(false)
属性添加到
parent.allPassengers
中的乘客项目中,但这种方法的问题是,如果在运输部分选中复选框,它也会在假日部分选中,因为它使用的是相同的可观察数组

有什么想法吗

编辑:


选中绑定也适用于可观察数组。因此,您可以简单地绑定到
$parent.selectedPassengers
,并将value属性指定为乘客id,如下所示:

<input type="checkbox" data-bind="attr: { value: id },
                                  checked: $parent.selectedPassengers" />
function transport(pageVM) {
    ....
    this.selectedPassengers = ko.observableArray([]);    
    ....

    this.addTransport = function() {
        this.selectedItems.push({ 
            ....
            selectedPassengers: this.selectedPassengers()
        });
    };    
};

您可以使用
ko.computed
返回所选乘客():


难道每个乘客都不能有两个可观测值,
checkedTransport=ko.可观测值(false)
checkedHoliday=ko.可观测值(false)
吗?不,我不想采用这种方法,因为我们可以有多个假日/运输区段。此外,我不希望乘客部分对其他部分有依赖/了解…好的,这是有道理的。因此,
transportItems
应包含“Transport”的所有乘客对象和
holidayItems
所有“holidayItems”的对象?transportItems/holidayItems应包含对象,而这些对象又应包含选定乘客的数组。我已经添加了示例代码,在向items数组添加transport/holiday时应该执行这些代码!我忘了check可以处理数组。你得到了我的支持,我收回了我的答案。几乎完全相同,但使用单击绑定并手动更新辅助数组。使用数组进行检查绑定时,工作量要小得多。这会遇到与我上面的小提琴相同的问题吗?当在多视图模型中使用时,在一个部分中选中一个复选框将在另一个部分中选中它…是的,我错过了多视图模型的内容,而是将其解释为“一个底层阵列,多个可观察阵列”。哎呀。
function transport(pageVM) {
    ....
    this.selectedPassengers = ko.observableArray([]);    
    ....

    this.addTransport = function() {
        this.selectedItems.push({ 
            ....
            selectedPassengers: this.selectedPassengers()
        });
    };    
};
var ViewModel = function () {
    this.allPassengers = ko.observableArray([
        { name: 'John', selected: ko.observable(false) },
        { name: 'Jane', selected: ko.observable(false) },
        { name: 'Mark', selected: ko.observable(false) }
    ]);

    this.selectedPassengers = ko.computed(function () {
        return ko.utils.arrayFilter(this.allPassengers(), function (item) {
            return item.selected();
        });
    }, this);
};