【问题标题】:Knockout - Deleting item from ViewModel doesn't remove from DOM淘汰赛 - 从 ViewModel 中删除项目不会从 DOM 中删除
【发布时间】:2013-04-24 14:14:20
【问题描述】:

我有一个包含对象集合“文件”的视图模型。

显然这是绑定到 DOM 的。

当我从“文件”集合中删除一个项目时,我希望 DOM 会更新以反映这一点,但它不会更新。

这是我用于从“文件”集合中删除项目的 JS。

this.Delete = function(id) {
    for (var f = 0; f < this.Files.length; f++) {
        if (this.Files[f].ID() == id) {
            this.Files.splice(f, 1);
        }
    }
}.bind(this);

如果我在调用 Delete(id) 后将集合的长度打印到控制台,我可以看到一个项目被删除。

那么为什么 DOM 没有更新呢?

如果我调用 ko.applyBindings(... 那么它确实会更新,但我的理解是我不应该在每次视图模型更新时都调用它。

那么我可能做错了什么?

另外,我已经尝试将 Files 作为 observableArray 和标准数组,没有任何区别。

更新:这是视图模型的定义(嗯...相关部分,无论如何)

function Files(files) {

    var self = this;

    self.Files = ko.observableArray([]);

    this.Delete = function(id) {
        // find which index the specified ID exists at
        for (var f = 0; f < this.Files().length; f++) {
            if (this.Files()[f].ID() == id) {
                this.Files().splice(f, 1);
            }
        }
    }.bind(this);

    ...
}

我也试过了

self.Files = [];

然后将 Files() 的每个实例更改为文件。没有区别。

【问题讨论】:

  • Files 是如何定义的?它应该是observableArray,否则它可以工作......你说过你已经尝试过observableArray,你能发布你的Delete函数的那个​​版本吗?

标签: knockout.js


【解决方案1】:

你需要有可观察的数组:

self.Files = ko.observableArray([]);

但您需要使用this.Files.splice 直接在可观察数组上调用splice

this.Delete = function(id) {
    // find which index the specified ID exists at
    for (var f = 0; f < this.Files().length; f++) {
        if (this.Files()[f].ID() == id) {
            this.Files.splice(f, 1);
        }
    }
}.bind(this);

否则,您在 KO 不知道删除的情况下从底层数组中删除项目,因此它无法更新 DOM。另请参阅文档Manipulating an observableArray 部分。

顺便说一下,observableArray 有一个remove 函数,可以大大简化你的代码:

this.Delete = function(id) {
    this.Files.remove(function(item) { return item.ID() == id; } );        
}.bind(this);

【讨论】:

  • 天哪,如此简单,但我可能已经花了几个小时试图弄清楚这一点。非常感谢,@nemesv。
  • 对 this.Files.remove 建议的一个小修改是 item.ID() 应该只是 item.ID(没有括号)。再次感谢。
  • 您的示例中有.ID()...我刚刚复制并假设您的ID 属性是ko.observable
  • 是的,没错,我确实错误地拥有了 ID()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2015-01-04
  • 2018-06-05
相关资源
最近更新 更多