删除克隆元素上的knockout js绑定
我正在使用knockout js模板绑定function将一组项目呈现给一个元素:
ko.applyBindings(new function () { this.childItems = [{ Text: "Test", ImageUrl: "Images/Image.png" }]; });
单击时,将克隆子项并将其放入另一个元素中:
$(".childSelector").on("click", ".childItem", function () { var clone = $(this).clone()[0]; ko.cleanNode(clone); $(".targetNode").append(clone); });
问题是当源数据更改并且模板重新绑定到新数据时,会引发以下错误:
未捕获错误:无法解析绑定。 消息:ReferenceError:未定义文本; 绑定值:attr:{title:Text}
我找到了另一个post,建议使用ko.cleanNode(element)
删除knockout的绑定,但是这并没有解决我的问题。
有没有办法在克隆元素上删除knockout的绑定以防止重新绑定时出现此错误? 如果不是,我只是通过从被点击的元素中提取所需的数据来“手动”克隆元素。
这是我正在做的一个简单的例子
您可以通过遍历DOM并删除data-bind
属性和knockout注释来从元素中删除所有knockout绑定。
使用removeDataBindings(clone);
但首先用ko.cleanNode(clone)
清理节点以清除任何事件处理程序。
var commentNodesHaveTextProperty = document.createComment("test").text === ""; var startCommentRegex = commentNodesHaveTextProperty ? /^$/ : /^\s*ko(?:\s+(.+\s*\:[\s\S]*))?\s*$/; var endCommentRegex = commentNodesHaveTextProperty ? /^$/ : /^\s*\/ko\s*$/; function isStartComment(node) { return (node.nodeType == 8) && (commentNodesHaveTextProperty ? node.text : node.nodeValue).match(startCommentRegex); } function isEndComment(node) { return (node.nodeType == 8) && (commentNodesHaveTextProperty ? node.text : node.nodeValue).match(endCommentRegex); } function traverseNode(node, func) { func(node); node = node.firstChild; while (node) { traverseNode(node, func); node = node.nextSibling; } } function removeDataBindings(element) { var koComments = []; traverseNode(element, function (node) { if (isStartComment(node) || isEndComment(node)) { koComments.push(node); return; } //remove the 'data-bind' attributes if (node.nodeType === 1) { //ELEMENT_NODE node.removeAttribute('data-bind'); } }); //remove Knockout binding comments for (i = 0; i < koComments.length; i++) { node = koComments[i]; if (node.parentNode) { node.parentNode.removeChild(node); } } }
Oliver,使用jQuery克隆绑定到这样的淘汰元素并不是一个好主意。 您应该为targetNode
使用数据绑定。 如果你还没有这样做,最好通过Knockout Tutorials来深入了解基本用法。
如果你试图保留一个项目列表,使用一个克隆按钮,这里是一个死的简单小提琴,只使用Knockout这样做。 如果您正在尝试做其他事情,请告诉我; 你的问题并不完全清楚你的目标。
HTML:
JS:
var ViewModel = function(data) { var self = this; self.items = ko.observableArray(data); self.clone = function(item) { //The ko.toJS here is a handy copy tool for viewModels //It isn't necessary for simple arrays like this one //But I included it because for an array of objects, you will want to use it self.items.push(ko.toJS(item)); }; };