在Knockout.js中删除动态创建的行

时间:2014-04-15 23:08:10

标签: javascript knockout.js

我使用的是knockout.js 2.3.0,我有一个表,其中包含动态添加的行和每个行中的选择列表。更改日期输入后,选择列表将填充不同的内容。由于不同的日期会使用不同的内容填充列表,因此我想删除之前添加的所有行,因为内容可能不准确。

我遇到的问题是并非所有行都被删除。例如:如果我有超过4行,则总会有2行。清除所有行的唯一时间是只有一行开始。

这是删除行的订阅功能

 self.date.subscribe(function() {

    //I also tried setting the loop length to a very long number but the same results happened each time
    for (i = 0; i < self.customers().length; i++){
       self.customers.remove(self.customers()[i]);
    }

    //now populate the select list and add an empty row - commented out for testing to make sure rows are being deleted
    //setCustomerList(self.date());
    //self.customers.push(new AddCustomer(self.customerList[0]));
}); 

我只是在测试看看会发生什么,而且我要删除所有行的唯一方法是添加多个for循环,这显然是不可取的。

是否有更简单的方法可以删除所有动态添加的行?

2 个答案:

答案 0 :(得分:2)

如果要删除可观察数组中的所有项,请使用removeAll方法:

self.customers.removeAll();

如果你真的想要使用一个循环,你可以通过不断删除最后一个(或第一个)项目来实现,直到没有剩下:

while (self.customers().length) {
   self.customers.pop();
}

答案 1 :(得分:1)

我认为您需要反转for循环并从下往上删除项目。你的代码的问题在于,每次删除一个项目时,数组的长度都会发生变化。

self.date.subscribe(function() {
    var customerLength = self.customers().length
    for (i = customerLength ; i >= 0; i = i - 1){
       self.customers.remove(self.customers()[i]);
    }
});