关于javascript:如何在带有敲除的循环中删除一块observableArray?

How to remove a piece of an observableArray inside a loop with knockout?

我在名为emails的observableArray中有一个对象数组。阵列中的每封电子邮件都有一个关联的复选框,可以一次选择多个消息。为了将功能应用于多个项目,我遍历电子邮件以查看是否已检查它们,如果它们已运行,则运行该函数:

1
2
3
4
5
6
7
self.deleteSelected = function() {
    for (var i = 0; i < self.emails().length; i++) {
        if (self.emails()[i].selected() == true) {
            ** what would go here **
        }
    }
}

我在那里的循环完全可以实现我的期望,因为我将其与其他函数一起使用,但是我似乎无法获得正确的函数来从observableArray中删除索引。如果尝试使用.remove().splice,但我无法使它们中的任何一个正常工作。

有什么想法我需要添加到该函数中以使其在循环遍历时删除数组中的相应索引吗?


我猜您在从要遍历的数组中删除元素时遇到了麻烦。作为一种替代方法,为什么不使用要保留的项目构建新的数组?

遵循这些原则的方法应该起作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
self.deleteSelected = function() {

    var emails = self.emails(),
        emailsLength = emails.length,
        emailsToKeep = [];

    for (var i = 0; i < emailsLength; i++) {
        if (emails[i].selected() !== true) {
            emailsToKeep.push(emails[i]);
        }
    }

    self.emails(emailsToKeep);
}

顺便说一句,从性能的angular来看,用一个操作替换observableArray还是更好的:每次使用splice()remove()时,都会导致相关的DOM完全重建,这这样只会发生一次。

请注意,在我的代码中还有两个其他小的性能改进:

  • 我将可观察对象缓存在变量中,而不是每次都检索它们

  • 我将数组length存储在变量中,而不是在每个for循环中访问该属性。