【问题标题】:Update parent knockout observable array items when one of the observable inside array changes当内部可观察数组之一发生更改时,更新父剔除可观察数组项
【发布时间】:2016-11-12 19:58:19
【问题描述】:

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

我在一个循环中初始化 details 数组并在那里附加订阅,因为关闭,只有最后一个 detail 对象在订阅函数内可用。

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

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

【问题讨论】:

    标签: javascript knockout.js closures knockout-3.0


    【解决方案1】:

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

    Working fiddle

    【讨论】:

    • 我想到了这个,有可能,谢谢。我们怎样才能使订阅可以在循环中工作?我知道这与闭包有关。有什么想法吗?我也想试试,了解一下
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 2016-11-26
    • 2015-08-11
    • 1970-01-01
    • 2014-01-18
    • 2014-10-23
    • 2013-11-21
    • 1970-01-01
    相关资源
    最近更新 更多