Javascript KnockoutJs beta 3.0-如何销毁子元素?
目前,我有一个如下设置:Javascript KnockoutJs beta 3.0-如何销毁子元素?,javascript,json,knockout.js,multidimensional-array,Javascript,Json,Knockout.js,Multidimensional Array,目前,我有一个如下设置: ko.applyBindings(viewModel); $(".removeButton").live("click", function() { viewModel.ProductCategories.destroy(ko.dataFor(this)); }); $(".renameButton").live("click", function() { ko.dataFor(this).Name("
ko.applyBindings(viewModel);
$(".removeButton").live("click", function() {
viewModel.ProductCategories.destroy(ko.dataFor(this));
});
$(".renameButton").live("click", function() {
ko.dataFor(this).Name("Renamed Successfully!");
});
在我引入子元素的概念之前,这对我来说很有效。此时,删除事件不再适用于这些项目
有没有更通用的“销毁”元素的方法
KO显然知道我正在单击的元素(因为我可以重命名)
上述事件将在任何元素(子元素或其他元素)上都有效,但remove除外,remove仅在根元素上有效
我可以对元素本身调用remove吗?或者我必须添加一些方法来确定它在数组中的位置并像那样销毁它
比如,;这是最好的:
$(".removeButton").live("click", function() {
ko.dataFor(this).destroy();
});
为此:
$(".removeButton").live("click", function() {
viewModel.ProductCategories[someindex].Children.destroy(ko.dataFor(this));
});
谢谢,
Kohan主要问题是在试图销毁项目时确定父阵列是谁 有几种选择: 您可以使用
ko.contextFor
,而不是ko.dataFor
,它将返回一个包含属性的对象,例如$data、$parent、$parents
和$root
如果阵列具有相同的名称,则可以执行以下操作:
如果数组具有不同的名称,则可以在button元素上添加提示以了解父元素的名称,如:
否则,如果您真的希望它是泛型的,那么您可以使用带有绑定的强制作用域块,这将允许您通过$parent
访问父数组。但是,这将是未包装的数组,我们确实需要observableArray。通过一些额外的工作,您可以循环父项的父项的属性,并将基础数组与未包装数组进行比较,以找到要在项目中调用destroy的实际ObservalArray。像这样:
ko.applyBindings(viewModel);
$(".removeButton").live("click", function() {
viewModel.ProductCategories.destroy(ko.dataFor(this));
});
$(".renameButton").live("click", function() {
ko.dataFor(this).Name("Renamed Successfully!");
});
最后,如果您注意创建对象的方式,您可以将销毁功能推送到项目本身,而不需要直接访问父项。下面是一个示例,演示如何向使用传递给构造函数的父对象的对象添加destroyMe
方法:主要问题是在尝试销毁项时确定父数组是谁
有几种选择:
您可以使用ko.contextFor
,而不是ko.dataFor
,它将返回一个包含属性的对象,例如$data、$parent、$parents
和$root
如果阵列具有相同的名称,则可以执行以下操作:
如果数组具有不同的名称,则可以在button元素上添加提示以了解父元素的名称,如:
否则,如果您真的希望它是泛型的,那么您可以使用带有
绑定的强制作用域块,这将允许您通过$parent
访问父数组。但是,这将是未包装的数组,我们确实需要observableArray。通过一些额外的工作,您可以循环父项的父项的属性,并将基础数组与未包装数组进行比较,以找到要在项目中调用destroy的实际ObservalArray。像这样:
ko.applyBindings(viewModel);
$(".removeButton").live("click", function() {
viewModel.ProductCategories.destroy(ko.dataFor(this));
});
$(".renameButton").live("click", function() {
ko.dataFor(this).Name("Renamed Successfully!");
});
最后,如果您注意创建对象的方式,您可以将销毁功能推送到项目本身,而不需要直接访问父项。下面是一个示例,演示如何向使用传递给构造函数的父函数的对象添加destroyMe
方法:非常感谢您花时间解释这一点,并提供了一些很棒的代码示例!-出于好奇,我的每个项目都有一个Id和一个parentId,我可以用它来计算父项吗(而不是使用提示)我不认为parentId在这种情况下对我们帮助太多。我们已经可以使用$parent访问该对象,但是需要知道observableArray的名称。非常感谢您花时间解释这一点,并提供了一些很棒的代码示例出于好奇,我的每个项目都有一个Id和一个parentId,我可以用它来计算父项吗(而不是使用提示)我不认为parentId在这种情况下对我们帮助太多。我们已经可以使用$parent访问该对象,但需要知道observableArray的名称。