如何使用 Knockout.js 在特定位置将项目添加/插入到 ObservableArray

Posted

技术标签:

【中文标题】如何使用 Knockout.js 在特定位置将项目添加/插入到 ObservableArray【英文标题】:How to add/insert an item into an ObservableArray at a certain position with Knockout.js 【发布时间】:2011-11-11 04:28:54 【问题描述】:

我发现的所有淘汰示例似乎都在 ObservableArray 的末尾添加了一个新项目,使用如下:

viewModel.SomeItems.push(someNewItem);

当然,这会将项目放在数组的末尾。

如何在 ObservableArray 的某个位置添加一个项目?

例如。类似:

viewModel.SomeItems.push(someNewItem, indexToInsertItAt);

【问题讨论】:

【参考方案1】:

你应该可以使用原生 javascript splice 方法 -

viewModel.SomeItems.splice(2,0,someNewItem);

文档在这里 - https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice

此处的示例(不是特定于淘汰赛的)-How to insert an item into an array at a specific index?

来自 Knockout 文档 -

对于修改数组内容的函数,比如push和 splice, KO 的方法自动触发依赖跟踪 机制,以便所有注册的侦听器都收到更改通知, 并且您的 UI 会自动更新。

【讨论】:

谢谢。拼接工作。对于淘汰用户,如果您想根据现有项目查找索引以插入新项目,则 ko.utils.arrayIndexOf 也很有用。 这不适用于稀疏数组,至少它不适用于我在 chrome 中。请参阅下面的答案【参考方案2】:

用于淘汰赛

viewModel.SomeItems.unshift(someNewItem);

另请参阅:http://knockoutjs.com/documentation/observableArrays.html

【讨论】:

这会在数组的开头插入项目,因此如果您想在中间的位置插入项目,则无济于事。 我不知何故错过了将其插入数组中任何位置的部分。是的,这仅在您想插入开头时才有效。对此感到抱歉。【参考方案3】:

我制作了这个扩展功能,对我来说效果很好。如果我添加到稀疏数组的末尾,Splice 对我不起作用。

ko.observableArray.fn.setAt = function(index, value) 
    this.valueWillMutate();
    this()[index] = value;
    this.valueHasMutated();

这甚至适用于:

var a = ko.observableArray(['a', 'b', 'c']);
a.setAt(42, 'the answer');

【讨论】:

如果你想做 insertAt 而不是 setAt,只需将 this()[index] = value; 切换到 this.splice(index, 0, value);。谢谢亚当!

以上是关于如何使用 Knockout.js 在特定位置将项目添加/插入到 ObservableArray的主要内容,如果未能解决你的问题,请参考以下文章

Knockout.js - 如何使用“foreach”以两种不同的方式显示项目列表?

如何使用 Knockout.js 将多个 View 绑定到单个 ViewModel

Knockout JS 防止在特定子节点上触发点击事件

在 knockout.js 视图模型(数组)中存储特定元素

如何将 knockout.js 与 ASP.NET MVC ViewModels 一起使用?

knockout.js入门