当数组内部的可观察对象之一发生变化时,更新父淘汰可观察数组项
Update parent knockout observable array items when one of the observable inside array changes
我的 ViewModel 中基本上有一个可观察数组
self.details=ko.observableArray([]);
其中包含一个模型数组 - DetailModel,其中有一个 isChecked
属性 作为可观察值。
我想订阅对 isChecked
的更改并删除所有其他复选框检查。
for(var i=0;i<10;++i)
{
var detail=new DetailModel(i);
detailList.push(detail);
detail.isChecked.subscribe(function(checkBoxCheckedState){
if(checkBoxCheckedState==true)
{
/* Idea is to untick all other checkboxes if one is checked */
console.log(detail);
console.log(detailList);
ko.utils.arrayFilter(self.details(), function(detailRow) {
if(detailRow.id!=detail.id)
{
detailRow.isChecked(false);
}
});
}
});
我正在循环中初始化详细信息数组并在那里附加订阅,因为关闭,只有最后一个详细信息对象在订阅函数中可用。
如何在不将回调传递给子视图模型中的父/父模型引用的情况下实现相同的目的?
您真的需要在细节模型中 isChecked
吗?您可以考虑在父视图模型中只使用一个 selected
属性 吗?在这种情况下,您的子模型不必了解有关父视图模型的任何信息。查看示例代码
function DetailModel(name) {
this.name = name;
}
function ViewModel(items) {
this.items = ko.observableArray(items);
this.selected = ko.observable();
}
ViewModel.prototype.select = function select(data) {
var selected = this.selected.peek();
if (selected !== data) {
this.selected(data);
} else {
this.selected(null);
}
return true;
}
我的 ViewModel 中基本上有一个可观察数组
self.details=ko.observableArray([]);
其中包含一个模型数组 - DetailModel,其中有一个 isChecked
属性 作为可观察值。
我想订阅对 isChecked
的更改并删除所有其他复选框检查。
for(var i=0;i<10;++i)
{
var detail=new DetailModel(i);
detailList.push(detail);
detail.isChecked.subscribe(function(checkBoxCheckedState){
if(checkBoxCheckedState==true)
{
/* Idea is to untick all other checkboxes if one is checked */
console.log(detail);
console.log(detailList);
ko.utils.arrayFilter(self.details(), function(detailRow) {
if(detailRow.id!=detail.id)
{
detailRow.isChecked(false);
}
});
}
});
我正在循环中初始化详细信息数组并在那里附加订阅,因为关闭,只有最后一个详细信息对象在订阅函数中可用。
如何在不将回调传递给子视图模型中的父/父模型引用的情况下实现相同的目的?
您真的需要在细节模型中 isChecked
吗?您可以考虑在父视图模型中只使用一个 selected
属性 吗?在这种情况下,您的子模型不必了解有关父视图模型的任何信息。查看示例代码
function DetailModel(name) {
this.name = name;
}
function ViewModel(items) {
this.items = ko.observableArray(items);
this.selected = ko.observable();
}
ViewModel.prototype.select = function select(data) {
var selected = this.selected.peek();
if (selected !== data) {
this.selected(data);
} else {
this.selected(null);
}
return true;
}