【问题标题】:Removeall function based on a condition not working根据条件不工作删除所有功能
【发布时间】:2019-09-10 11:43:11
【问题描述】:

我使用 observableArray 编写了一个带有 Knockout 的程序,我想根据条件从该数组中删除一个元素。但它不起作用,我的程序是这样的:

 var app = function (appname, appdesc,isactive) {
            this.appname = appname;
            this.appdesc = appdesc;
            this.active = isactive;
        }
        var mainVM = function () {
            var app1 = new app('sap', 'sap b1', false);
            var app2 = new app('Magento', 'Magento 1', false);
            //this.appList = ko.observableArray();
            this.appList = ko.observableArray([app1, app2]);
        }
        var appVM = new mainVM();
        ko.applyBindings(appVM)

$('#btnDel').click(function () {

            appVM.appList.removeAll([{ "active": false }]);
        })

【问题讨论】:

    标签: javascript knockout.js knockout-3.0


    【解决方案1】:

    您正试图通过发送参数{'active': false} 来执行removeAll 函数。换句话说,您要求 Knockout 确定 appList 内的任何 app 实例是否等于对象 {'active': false}。他们不是平等的!

    这是app1:

    {
       appname: 'sap',
       appdesc: 'sap b1',
       active: false
    }
    

    这是app2:

    {
       appname: 'Magento',
       appdesc: 'Magento 1',
       active: false
    }
    

    您传递的用于比较的参数是这样的:

    {
       active: false
    }
    

    它们非常不同。


    即使您创建 2 个具有相同输入的实例,它们也不相等。看这里:

    var app = function (appname, appdesc,isactive) {
        this.appname = appname;
        this.appdesc = appdesc;
        this.active = isactive;
    }
    
    var app1 = new app('moo', 'coo', false);
    var app2 = new app('moo', 'coo', false);
    
    document.getElementById('secret').innerHTML = (app1 === app2);
    is app1 equal to app2?
    
    <br><br>
    
    <span id="secret"></span>

    因此,当您处理对象时,我建议的原始选项 remove 是适合您的功能。

    var app = function (appname, appdesc,isactive) {
                this.appname = appname;
                this.appdesc = appdesc;
                this.active = isactive;
            }
            var mainVM = function () {
                var app1 = new app('sap', 'sap b1', true);
                var app2 = new app('Magento', 'Magento 1', false);
                //this.appList = ko.observableArray();
                this.appList = ko.observableArray([app1, app2]);
            }
            var appVM = new mainVM();
            ko.applyBindings(appVM)
    
            $('#btnDel').click(function () {
    
                appVM.appList.remove(function(item){
                  return !item.active;
                });
            })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
    
    <!-- ko foreach: appList -->
    <span data-bind="text: ko.toJSON($data)"></span>
    <br>
    <!-- /ko -->
    
    <br><br>
    <button id="btnDel">Delete</button>

    removeAll 带参数只在这种情况下有用,它是一个原始数据类型:

    var mainVM = function () {
                
                this.appList = ko.observableArray([false, true]);
            }
            var appVM = new mainVM();
            ko.applyBindings(appVM)
    
            $('#btnDel').click(function () {
    
                appVM.appList.removeAll([false]);
            })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
    <!-- ko foreach: appList -->
    <span data-bind="text: ko.toJSON($data)"></span>
    <br>
    <!-- /ko -->
    
    <br><br>
    <button id="btnDel">Delete</button>

    【讨论】:

    • 但是在文档中写到我们可以在 removeall() 方法中传递参数。 removeAll( ['Chad', 132, undefined] ) — 删除所有等于 'Chad'、123 或 undefined 的值,并将它们作为数组返回。
    • 啊,你说得对,我的错。我以前从未注意到这一点。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2011-01-11
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多