当数组内部的某个可观察数组项发生更改时,更新父挖空可观察数组项

Update parent knockout observable array items when one of the observable inside array changes

本文关键字:数组 观察 更新 内部      更新时间:2023-09-26

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

我正在循环中初始化详细信息数组并在那里附加订阅,由于闭包,订阅函数中只有最后一个详细信息对象可用。

如何在不将回调传递给子视图模型中的父/父模型引用的情况下实现相同的目标?

https://jsfiddle.net/7srbxu5y/17/

你真的需要在详细模型中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;
}

工作小提琴