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的名称。