我还在学习淘汰赛,如果我的方法有误,请指导我。
这是我的小提琴:http://jsfiddle.net/amitava82/wMH8J/25/
在编辑时,我收到了json模型,它在视图中表示,我想从模型中删除某些项目(子数组)或操作(父数组)(我删除了添加UI以添加更多操作来自为了简单起见,然后最终将模型传递回服务器。
现在,从根级别删除很容易。我坚持要删除 ActionItems 数组中 ActionParamaters 的单个项目。
如何从子数组中删除项?
答案 0 :(得分:6)
您可以将单击的actionItem和包含的action数组传递给deleteActionItem函数,如下所示:
<!-- /ko -->
<a href="javascript:void(0)" data-bind="click: $root.deleteActionItem.bind($data, $parent)">remove item</a>
在你的模型中,你需要使用ko.mapping插件使每个actionItem数组都可观察(参见编辑函数)
var viewModel = function() {
var self = this;
self.data = ko.observable();
self.edit = function() {
self.data ( ko.mapping.fromJS(editData) );
}
self.log = function() {
console.log(self.data())
}
self.deleteAction = function(data) {
//delete root node
self.data().remove(data)
}
self.deleteActionItem = function(data,actionItem) {
//delete items
data.ActionItems.remove(actionItem);
}
}
然后你将能够从deleteActionItem函数中的数组中删除项目,因为现在可以观察到数组,结果将反映到绑定的dom元素。
答案 1 :(得分:1)
这是HTML,请注意,remove函数位于数组的上下文中,因此它调用$parent
上的函数而不是$root
。这使我们可以直接在上面定位上下文,而不是根目录。
<ul data-bind="foreach: editData">
<li>
<span data-bind="text: name"></span>
<button data-bind="click: $parent.removeParent">Remove Parent</button>
...
<!-- This line is on the child context -->
<button data-bind="click: $parent.removeChild">Remove Child</button>
</ul>
这是父模型。注意这里的删除功能是为了删除孩子。当调用removeChild
函数时,它来自子上下文,要求$parent
,这将调用此删除。
var Parent = function(name, children) {
var self = this;
self.name = ko.observable(name);
self.children = ko.observableArray(children);
self.removeChild = function(child) {
self.children.remove(child);
};
};
您的小提琴也不使用模型,这是MVVM开发的一个重要方面。您应该考虑通过the tutorials on the knockout site来更好地理解如何构建淘汰应用程序。它将帮助您更轻松地处理这类问题。