使用 knockoutjs es5 从数组中删除项目
deleting items from an array with knockoutjs es5
我正在尝试将 knockout.js 与 ES5 插件一起使用,但我无法从数组中删除以正常工作。
它似乎有点工作,你可以删除,但数组中总是有一个项目,但不知何故。我完全不明白为什么这不能像你想象的那样工作。
我做错了什么?
(我有一个使用 durandal 小部件的更复杂的场景,但我能够将其归结为这个,所以我认为 es5 插件是罪魁祸首)
这是我的标记:
<div data-bind="foreach: staffList" style="border:1px solid black;">
<div style="border: 1px solid red;">
<p data-bind="text: Name"></p>
<p>
<button data-bind="click: deleteClickHandler">Delete</button>
</p>
</div>
</div>
和脚本:
function ctor(){
var self=this;
self.staffList = [{Name:'one'},{Name:'two'},{Name:'three'},{Name:'four'}];
ko.track(self.staffList, { deep: true });
self.deleteClickHandler = function (obj) {
//TODO show confirm dialog first
var index = self.staffList.indexOf(obj);
if (index >= 0) {
self.staffList.splice(index, 1);
}
};
}
ko.applyBindings(ctor);
现实世界中唯一的不同是我从 API 调用中获取数据,但行为是相同的。
嵌套在 foreach 循环中的 按钮 需要引用父级,因此会是
<button data-bind="click: $root.deleteClickHandler">Delete</button>
而不是
<button data-bind="click: deleteClickHandler">Delete</button>
我刚刚对此进行了测试,发现视图中没有列出剩余的项目。这应该可以解决您遇到的问题,因为我在删除最后一项后看到一个空数组。
此外,我不得不将 ko.applyBindings 调用更改为 ko.applyBindings(new ctor());
并删除了 ko.track 调用支持 staffList 对象的普通可观察数组。除非有特定原因,否则您不能使用 observableArray?
有趣的问题。我还不确定根本原因,但我确实设法找到了使它起作用的方法。我需要做一些改变:
- 使
ctor
成为真正的构造函数/这样使用它;
- 由于上一点,您需要在特定范围内引用
deleteClickHandler
;
- 跟踪
self
,不只是一个成员;
这是我 works 的示例:
<div data-bind="foreach: staffList" style="border:1px solid black;">
<div style="border: 1px solid red;">
<span data-bind="text: Name"></span>
<button data-bind="click: $root.deleteClickHandler">Delete</button>
</div>
</div>
<hr>
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
function ViewModel(){
var self = this;
self.staffList = [{Name:'one'},{Name:'two'},{Name:'three'},{Name:'four'}];
ko.track(self);
self.deleteClickHandler = function (obj) {
var index = self.staffList.indexOf(obj);
if (index >= 0) {
self.staffList.splice(index, 1);
}
};
}
ko.applyBindings(new ViewModel());
另外,我想提一下,这也是可能的:
self.deleteClickHandler = function (obj) {
self.staffList.remove(obj);
};
同样,我不确定为什么 ko.track(self.staffList)
不起作用,但以上至少可以让你继续。
我正在尝试将 knockout.js 与 ES5 插件一起使用,但我无法从数组中删除以正常工作。
它似乎有点工作,你可以删除,但数组中总是有一个项目,但不知何故。我完全不明白为什么这不能像你想象的那样工作。
我做错了什么?
(我有一个使用 durandal 小部件的更复杂的场景,但我能够将其归结为这个,所以我认为 es5 插件是罪魁祸首)
这是我的标记:
<div data-bind="foreach: staffList" style="border:1px solid black;">
<div style="border: 1px solid red;">
<p data-bind="text: Name"></p>
<p>
<button data-bind="click: deleteClickHandler">Delete</button>
</p>
</div>
</div>
和脚本:
function ctor(){
var self=this;
self.staffList = [{Name:'one'},{Name:'two'},{Name:'three'},{Name:'four'}];
ko.track(self.staffList, { deep: true });
self.deleteClickHandler = function (obj) {
//TODO show confirm dialog first
var index = self.staffList.indexOf(obj);
if (index >= 0) {
self.staffList.splice(index, 1);
}
};
}
ko.applyBindings(ctor);
现实世界中唯一的不同是我从 API 调用中获取数据,但行为是相同的。
嵌套在 foreach 循环中的 按钮 需要引用父级,因此会是
<button data-bind="click: $root.deleteClickHandler">Delete</button>
而不是
<button data-bind="click: deleteClickHandler">Delete</button>
我刚刚对此进行了测试,发现视图中没有列出剩余的项目。这应该可以解决您遇到的问题,因为我在删除最后一项后看到一个空数组。
此外,我不得不将 ko.applyBindings 调用更改为 ko.applyBindings(new ctor());
并删除了 ko.track 调用支持 staffList 对象的普通可观察数组。除非有特定原因,否则您不能使用 observableArray?
有趣的问题。我还不确定根本原因,但我确实设法找到了使它起作用的方法。我需要做一些改变:
- 使
ctor
成为真正的构造函数/这样使用它; - 由于上一点,您需要在特定范围内引用
deleteClickHandler
; - 跟踪
self
,不只是一个成员;
这是我 works 的示例:
<div data-bind="foreach: staffList" style="border:1px solid black;">
<div style="border: 1px solid red;">
<span data-bind="text: Name"></span>
<button data-bind="click: $root.deleteClickHandler">Delete</button>
</div>
</div>
<hr>
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
function ViewModel(){
var self = this;
self.staffList = [{Name:'one'},{Name:'two'},{Name:'three'},{Name:'four'}];
ko.track(self);
self.deleteClickHandler = function (obj) {
var index = self.staffList.indexOf(obj);
if (index >= 0) {
self.staffList.splice(index, 1);
}
};
}
ko.applyBindings(new ViewModel());
另外,我想提一下,这也是可能的:
self.deleteClickHandler = function (obj) {
self.staffList.remove(obj);
};
同样,我不确定为什么 ko.track(self.staffList)
不起作用,但以上至少可以让你继续。