【问题标题】:how do i insert element in knockout array at specific index我如何在特定索引处插入淘汰数组中的元素
【发布时间】:2014-05-31 20:55:01
【问题描述】:

如何在敲除数组中的特定索引处插入元素

我知道我们必须使用切片和推送,但是最好的方法是什么以及如何在可观察数组的特定位置插入新元素

【问题讨论】:

标签: knockout.js ko.observablearray


【解决方案1】:

使用splicedocs 对此并不清楚(我必须自己仔细检查),但是您可以像使用常规 javascript .splice 一样使用它来插入和删除元素。例如:

var vm = {
    array : ko.observableArray(["foo","bar"])
};

ko.applyBindings(vm);

function Add() {
    vm.array.splice(1,0,"ra");    // at index 1 - remove 0 elements and add "ra"
}

Add();   // "ra" gets inserted between "foo" and "bar"

http://jsfiddle.net/aL4D6/

【讨论】:

  • Matt,只是因为我很好奇,为什么不将add 函数定义为视图模型的一部分呢?它现在依赖于全局命名空间中存在的 vm。相反,您可以在定义vm 时将该函数作为附加属性插入,如在此fiddle 中。然后,您甚至可以通过绑定以及在这个fiddle(很好的答案顺便说一句,我 +1 给你)中与函数进行交互
  • @KyleMit:因为我正在快速拼凑一些东西来展示原理。毫无疑问,我会把它放在虚拟机中。
  • 是的,很公平。我是淘汰赛的新手,所以我不知道是否还有其他事情在发挥作用。这个问题给实现留下了很大的想象空间。
  • 感谢马特,此代码有效,但不能自动刷新用户界面,我必须编写 valueWillMutate() 和 valueHasMutated() 才能自动刷新用户界面,你知道他们做什么吗?再次感谢。
  • @ritzy:它在我的小提琴中运行良好。你一定有其他事情发生。如果您提出另一个问题并包含您的代码(最好是在小提琴中),那么有人可能会帮助您。
【解决方案2】:

我可以用splice 正常执行此操作(没有理由切片和推送,因为 splice 实际上可以执行此操作)。只需将您的起始位置然后 0 指定您实际上不想删除一个项目,而只添加。

var ViewModel = function() {
    this.list = ko.observableArray([1, 2, 3, 5]);
};
vm = new ViewModel();
ko.applyBindings(vm);

所以如果你然后做类似的事情

vm.list.splice(3,0, 'new element');

它将插入到数组中的特定位置。当然,您可以将此代码放入模型中并将其绑定到某个事件。

【讨论】:

  • 你如何访问绑定的 ViewModel 来拼接它 - 代码的复制和粘贴在这个小提琴中似乎不起作用jsfiddle.net/3vCdD
  • @KyleMit 对此感到抱歉。更新的小提琴在这里(答案也更新了):jsfiddle.net/3vCdD/1
猜你喜欢
  • 2019-11-20
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
相关资源
最近更新 更多