代码之家  ›  专栏  ›  技术社区  ›  Keval Mehta

Knockout JS:替换多维数组中的特定字段值

  •  0
  • Keval Mehta  · 技术社区  · 6 年前

    我想替换多维数组中的特定字段值。我试着用替换函数来替换它。

    当我检查我的ko可观察数组时,下面的数组显示在控制台中。

    0 : {id: "1", title: "IT Manager", "description" : "description 1"}
    1 : {id: "2", title: "Manager", "description" : "description 2"}
    

    我想动态地改变值,就像在1个索引数组中一样 .

    changeQty : function(itemIndex){
    
                    self.displayProductData.splice(4,self.displayProductData()[itemIndex.id], newQtyVal);
    
                },
    

    怎么做?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ray    6 年前

    如果试图替换可观察数组中某个对象的特定属性,它将不起作用,因为这些属性本身是不可观察的。

    您有两个选择:

    1. 使每个可以更新的对象的每个属性都是可观察的。如果选择此选项,请阅读 this question .
    2. 替换整个对象本身。

    你提到替换不起作用。你是这样做的吗?

    var viewModel = function(){
      var self = this;
      
      //demo
      var itemIndex = {
        id:1
      }
      
      self.displayProductData = ko.observableArray([
        {id: 0, description: 'desc 1'},
        {id: 1, description: 'desc 2'}
      ]);
      self.replaceObject = function(data, event){
        var oldObject = self.displayProductData().find(function(arrayObject){ 
            return data.id === arrayObject.id; 
          });
        var newObject = Object.assign({}, oldObject);
        newObject.description = "replace method desc";
        self.displayProductData.replace(oldObject, newObject);
      };
      
      self.replaceObjectWithSplice = function(data, event){
        var oldObject = self.displayProductData().find(function(arrayObject){ 
          return data.id === arrayObject.id; 
        });
        var newObject = Object.assign({}, oldObject);
        newObject.description = "splice desc";
        self.displayProductData.splice(data.id, 1, newObject);
      };
    };
    
    ko.applyBindings(new viewModel());
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
    
    
    
    <ul data-bind="foreach: displayProductData">
        <li>
          <span data-bind="text: id"></span>, 
          <span data-bind="text: description"></span>
          <button data-bind="click: $parent.replaceObject">Replace</button>
          <button data-bind="click: $parent.replaceObjectWithSplice">Splice</button>
        </li>
    </ul>

    注意:如果要替换大量数据,我的答案不是最有效的方法—每次创建新对象都需要额外的内存。

    编辑: 根据评论,我把按钮移到了 foreach 循环以显示当您从Knockout对象中调用函数时(在本例中 displayProductData event .