使用angular.forEach函数过滤HTML表以替换许多if/else语句
Filter HTML table with function using angular.forEach to replace many if/else statements
在angularJS应用程序中有一个HTML表:
HTML:
<tr ng-repeat="player in playerdata | filter:tableFilter" >
有一个名为tableFilter
的函数,看起来是这样的:
function tableFilter (player) {
if ( player.GP < $scope.GPMin || player.GP > $scope.GPMax) { return false; };
if ( player.GA60 < $scope.GA60Min || player.GA60 > $scope.GA60Max) { return false; };
if ( player.SA60 < $scope.SA60Min || player.SA60 > $scope.SA60Max) { return false; };
if ( player.FA60 < $scope.FA60Min || player.FA60 > $scope.FA60Max) { return false; };
if ( player.CA60 < $scope.CA60Min || player.CA60 > $scope.CA60Max) { return false; };
return true;
};
这很好:当条件不满足时,它会根据需要将球员从积分榜上除名。
然而,可能会看到这里出现的模式,并且由于我有5个以上的stats
,所以我需要整理它以供重用。我失败的尝试:
function tableFilter (player) {
var stats = [
'GP','GA60','SA60','FA60','CA60' // etc
];
angular.forEach(stats, function (stat) {
var statMin = $scope[stat + 'Min'];
var statMax = $scope[stat + 'Max'];
var p = player[stat];
if ( p < statMin || p > statMax ) { return false; };
});
return true;
};
这将运行,我可以按预期console.log
结果,但HTML不会更新(或仅使用过滤后的值重新呈现)。
我在这里缺少了什么,如何使用第二个函数来过滤表?
您需要一种方法来打破这个循环。forEach
作用域中的return false
不会从filter
函数返回,因此每次在forEach
中return false
时都会返回true
(此调用只是从循环中断)。您可以在变量中设置所需的返回布尔值,并在找到该循环时中断,然后返回var
。观察以下(未经测试)。。。
function tableFilter (player) {
var stats = [
'GP','GA60','SA60','FA60','CA60' // etc
];
var truthy = true;
angular.forEach(stats, function (stat) {
var statMin = $scope[stat + 'Min'];
var statMax = $scope[stat + 'Max'];
var p = player[stat];
if(p < statMin || p > statMax) {
truthy = false; // -- store value to return from .filter
return; // -- return from forEach block
}
});
return truthy;
};
您的return false;
语句在forEach函数中,而不是在filter函数中。将其分配给筛选函数的局部变量,然后返回最终结果。
您可以更改数据的形状,例如
var filter = function(player) {
//player = { GA: 12, GP: 15, ... }
$scope.stats = { GA: { min: 10, max: 20 }, GP: { ... } ... }
var show = true;
angular.forEach($scope.stats, function(item, argname) {
if(player[argname] < item.min || player[argname] > item.max) {
show = false;
}
});
return show;
}
请注意angular.forEach将枚举对象的属性。
相关文章:
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 我如何找到一个句子中的所有空格并替换忽略它们
- 如何用更合适的内容替换document.write
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 在DOM中查找一个模式并替换它's的内容使用jquery
- 用空格替换下划线PHP
- str.split(someString).join(someOtherString)是否等效于替换
- 使用javascript的图像替换循环
- window.location替换并传递URL历史记录条目中的变量
- 替换标记中的属性
- 为什么在许多浏览器中drawImage()的性能略好于createPattern()
- 指令的模板必须只有一个根元素:With restrict E&替换true
- AngularJs对ng消息的自定义替换
- 用超链接替换URLS
- 用cdata标记替换脚本标记
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 将许多逗号替换为仅限空格的javascript
- 使用angular.forEach函数过滤HTML表以替换许多if/else语句
- 使用Tampermonkey替换许多文本术语,而不影响url,也不查找类或id
- 我如何用javascript替换在一个类下发现的许多地方的一个单词