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