javascript - 根据条件不工作删除所有功能
问题描述
我使用 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 }]);
})
解决方案
您正在尝试removeAll
通过发送参数来执行功能{'active': false}
。换句话说,您要求 Knockout 确定app
内部的任何实例appList
是否等于 object {'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
with parameters 仅在这种情况下有用,它是一种原始数据类型:
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>
推荐阅读
- qt - 如何在我的应用程序中使用 svg 或 qml 形状作为模板
- spring - 从 windows 主机向 docker 容器中运行的 spring api 发出请求
- node.js - 图片未使用 request.post 上传获取未定义的值
- deployment - ssh_init:网络错误:无法分配请求的地址
- excel - 在 vba 中具有预定义范围的特定单元格中的范围总和
- unity3d - Unity 运行时通过碰撞修改 3D Mesh
- python - Snakemake 中的 shell 命令中的 Gensub
- ios - 如何使应用程序的语言等于手机的语言
- xamarin.forms - 从导航堆栈中删除根页面?
- informatica - Informatica - Greenplum 数据库目标 - 增加吞吐量。ODBC.ini 文件中需要额外设置以增加吞吐量