javascript - 当数组内的可观察值之一发生更改时,更新父 knockout 可观察值数组项

标签 javascript knockout.js closures knockout-3.0

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

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

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

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

最佳答案

您真的需要在详细模型中使用 isChecked 吗?您是否可以考虑在父 View 模型中仅使用一个 selected 属性?在这种情况下,您的子模型不必了解有关父 View 模型的任何信息。查看示例代码

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

Working fiddle

关于javascript - 当数组内的可观察值之一发生更改时,更新父 knockout 可观察值数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38297312/

相关文章:

visual-studio-2010 - VS 2010 中的 MVC3 Razor 和 Knockout?

javascript - 使用 Knockout.js 绑定(bind) CSS3 动画回调

javascript - Knockout js 依赖链末端未更新

javascript - 为什么在 for 循环中声明的变量会更新而不是在每次迭代时重新创建?

javascript - 将数据从主页传递到模态内的 php 查询

javascript - 如何解码这个JavaScript?

generics - 如何包装nom tag_no_case解析器?

javascript - NodeJS 闭包 - 循环对象数组并使用每个对象的数据 Ping 服务器

javascript - 如果类存在则加载标记

javascript - FullCalendar - 使日期不可点击