KnockoutJS从可观察数组中删除项目.项目是ul中的listitem,由foreach生成

Hop*_*ppe 13 javascript knockout.js

使用KnockoutJS,如何从可观察数组中删除项?我希望能够单击listitem,并从数组中删除该项(从而删除列表).

下面的代码示例报告:'this.expertise is undefined'.

我是否需要定义某种专业知识对象,然后从内部调用它?

<ul data-bind="foreach: expertise">
    <li data-bind="text: Key, click: $parent.removeExpertise"></li>
</ul>

<script type="text/javascript">
    $(function () {
        function AppViewModel() {

            this.removeExpertise = function (expertise) {
                this.expertise.remove(expertise);

            };

            this.expertise = ko.observable([
                { Key: 'Charles', Value: 'Charlesforth' },
                { Key: 'Denise', Value: 'Dentiste' }
            ]);
        }

        // Activates knockout.js
        jQuery(document).ready(function () {
            ko.applyBindings(new AppViewModel());
        });
    });
</script>
Run Code Online (Sandbox Code Playgroud)

RP *_*yer 17

当你从孩子调用一个方法时,this将设置为子而不是$parent.

有许多方法可以确保removeExpertise使用适当的值调用this.一个简单的方法是使用.bind.

它看起来像:

this.removeExpertise = function (expertise) {
    this.expertise.remove(expertise);
}.bind(this);
Run Code Online (Sandbox Code Playgroud)

此外,您将希望expertise成为一个observableArray而不是observable一个observableArray暴露数组操作方法,包括一个remove函数.

  • .bind返回一个新函数,它包装原始函数并使用"this"的一致值调用它.在这种情况下,您希望它始终使用`AppViewModel`的实例作为`this`.希望有道理. (2认同)
  • 这样会很好:viewModel.items.remove("id",1); viewModel.items.remove("name","Jim"); viewModel.items.remove(someObject); (2认同)