如何使用Knockout.js将项添加/插入到某个位置的ObservableArray中

Mar*_*son 73 javascript mvvm knockout.js

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

viewModel.SomeItems.push(someNewItem);
Run Code Online (Sandbox Code Playgroud)

这当然将项目放在数组的末尾.

如何在特定位置向ObservableArray添加项?

例如.就像是:

viewModel.SomeItems.push(someNewItem, indexToInsertItAt);
Run Code Online (Sandbox Code Playgroud)

ipr*_*101 82

您应该能够使用本机JavaScript splice方法 -

viewModel.SomeItems.splice(2,0,someNewItem);
Run Code Online (Sandbox Code Playgroud)

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

这里的示例(不是Knockout特定的) - 如何在特定索引处将项插入数组?

来自Knockout文档 -

对于修改数组内容的函数,例如push和splice,KO的方法会自动触发依赖关系跟踪机制,以便向所有已注册的侦听器通知更改,并自动更新UI.

  • 谢谢.Splice工作.对于淘汰用户,如果要查找基于现有项目插入新项目的索引,ko.utils.arrayIndexOf也很有用. (7认同)

小智 23

用于淘汰赛

viewModel.SomeItems.unshift(someNewItem);
Run Code Online (Sandbox Code Playgroud)

另见:http://knockoutjs.com/documentation/observableArrays.html

  • 这会将项目插入数组的开头,因此如果要在中间插入一个项目,则无效. (15认同)

Ada*_*gen 12

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

ko.observableArray.fn.setAt = function(index, value) {
    this.valueWillMutate();
    this()[index] = value;
    this.valueHasMutated();
}
Run Code Online (Sandbox Code Playgroud)

这甚至适用于:

var a = ko.observableArray(['a', 'b', 'c']);
a.setAt(42, 'the answer');
Run Code Online (Sandbox Code Playgroud)

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