Knockout删除单击的行

时间:2016-09-01 18:22:13

标签: jquery knockout.js

我有一个带有嵌入式表的jQuery UI弹出窗口。用户可以点击" +"在弹出窗口底部签名,向表中添加一行。每行包含4个元素(3个文本输入& 1"删除行"按钮)。添加行很容易,但是在将删除按钮的行索引传递给我的" removeRow(index)"时,我很难识别它们的行索引。功能

这是HTML

    <table id="item-config-table" class="table table-bordered table-hover table-striped">
        <thead>
            <tr>                    
                <th>Qty</th>
                <th>Description</th>                    
                <th>Part #</th>
                <th>Delete</th>
            </tr>
        </thead>
        <tbody id="item-config-body">
            <tr>
                <td>
                    <input type="text">
                </td>
                <td>
                    <input type="text">
                </td>
                <td>
                    <input type="text">
                </td>
                <td>
                    //This line is the delete button
                    <a href="#" class="btn btn-default glyphicon glyphicon-minus" style="vertical-align:middle;padding:4px;" data-bind="click: function(data, event) {$root.RemoveConfigRow(data,event,$(this))}"><span style="font-family:'Arial Narrow', Arial, sans-serif; font-weight:bold; vertical-align:central;color:#1F497D;"></span></a>
                </td>
            </tr>
        </tbody>
    </table>

这是我的功能

 RemoveConfigRow = function (data, event, object) {
            var index = object.parent().parent().index();
            var count = $('#item-config-body tr').length;
            if (count > 1)
                document.getElementById('item-config-body').deleteRow(index);
        };

我尝试做的是将引用传递给当前元素 a ,然后将函数备份到 tr 两个级别。从那里我想在身体中找到它的索引来移除它。

当调用该函数时,会传递一个对象,但其中的数据似乎与所单击的链接元素没有任何联系。随后在对象上调用 .parent()。parent()。index()会返回 -1 。我的猜测是&#34;这个&#34;绑定在传递给函数时绑定到其他东西。

这篇文章让我非常接近,但是他传递的是硬编码参数而没有使用关键字&#39;这个&#39; Knockout firing click binding on applyBindings

1 个答案:

答案 0 :(得分:2)

不要这样做:

document.getElementById('item-config-body').deleteRow(index);

如果您想进行DOM操作,请不要使用Knockout。您与Knockout的合同是您将控制ViewModel,Knockout将控制DOM。

在Knockout中,你的问题减少了添加和删除ObservableArray的元素。

uid=1;

vm = {
  arr: ko.observableArray(),
  remove: function(data) {
    vm.arr.remove(data);
  },
  add: function() {
    vm.arr.push(uid++);
  }
};

ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<table>
  <tbody data-bind="foreach: arr">
    <tr>
      <td data-bind="text:$data"></td>
      <td>
        <button data-bind="click:$parent.remove">Remove</button>
      </td>
    </tr>

  </tbody>
</table>
<button data-bind="click: add">Add</button>