【问题标题】:ng-repeat filter negate string from object - angularjsng-repeat 过滤器从对象中否定字符串 - angularjs
【发布时间】:2014-08-15 06:18:43
【问题描述】:

我想放这个过滤器:filter:'!Category' 像这样进入这个元素:

<div ng-repeat="(prop, ignoredValue) in wines[0] | filter:'!Category'" ng-init="filter[prop]={}">

但它不会过滤掉“类别”属性。但是,如果我在以下 ng-repeat 元素上放置一个类似的过滤器以排除“Wine”,它就可以正常工作:

<span class="quarter" ng-repeat="opt in getOptionsFor(prop) | filter:'!Wine'">

我不明白为什么我不能在这里过滤掉属性值。我对 angularjs 很陌生,我想弄清楚这一点。我想从对象中排除特定的属性名称。 “名称”或“类别”

我在下面链接了小提琴。非常感谢任何帮助!谢谢!

jsfiddle

<div ng-controller="myCtrl">
<div ng-repeat="(prop, ignoredValue) in wines[0]" ng-init="filter[prop]={}">
    <b>{{prop | capitalizeFirst}}:</b><br />
    <span class="quarter" ng-repeat="opt in getOptionsFor(prop)">
        <b><input type="checkbox" ng-model="filter[prop][opt]" />&nbsp;{{opt}}</b>
    </span>
    <hr />
</div>
<div ng-repeat="w in filtered=(wines | filter:filterByProperties)">
    {{w.name}} ({{w.category}})
</div>
<hr />
Number of results: {{filtered.length}}

var app = angular.module('myApp', []);
app.controller('myCtrl', function ($scope) {
$scope.wines = [
    { name: "Wine A", category: "red" },
    { name: "Wine B", category: "red" },
    { name: "wine C", category: "white" },
    { name: "Wine D", category: "red" },
    { name: "Wine E", category: "red" },
    { name: "wine F", category: "white" },
    { name: "wine G", category: "champagne"},
    { name: "wine H", category: "champagne" }    
];
$scope.filter = {};

$scope.getOptionsFor = function (propName) {
    return ($scope.wines || []).map(function (w) {
        return w[propName];
    }).filter(function (w, idx, arr) {
        return arr.indexOf(w) === idx;
    });
};

$scope.filterByProperties = function (wine) {
    // Use this snippet for matching with AND
    var matchesAND = true;
    for (var prop in $scope.filter) {
        if (noSubFilter($scope.filter[prop])) continue;
        if (!$scope.filter[prop][wine[prop]]) {
            matchesAND = false;
            break;
        }
    }
    return matchesAND;
/**/
/*
    // Use this snippet for matching with OR
    var matchesOR = true;
    for (var prop in $scope.filter) {
        if (noSubFilter($scope.filter[prop])) continue;
        if (!$scope.filter[prop][wine[prop]]) {
            matchesOR = false;
        } else {
            matchesOR = true;
            break;
        }
    }
    return matchesOR;
/**/
};

function noSubFilter(subFilterObj) {
    for (var key in subFilterObj) {
        if (subFilterObj[key]) return false;
    }
    return true;
}
});

app.filter('capitalizeFirst', function () {
return function (str) {
    str = str || '';
    return str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase();
};
});

【问题讨论】:

  • filter 不支持对对象键进行过滤。
  • 我明白了...您认为有什么方法可以轻松解决这个问题吗? @runTarm
  • 预期的结果是什么?在你的小提琴中,我无法找出任何问题。
  • 我想从对象中排除每个类别:“值”,或者每个名称:“值”。基本上我想这样做,例如,对象包括用户名、id、名字、姓氏等。我想排除某些键,如 id @runTarm

标签: javascript angularjs angularjs-ng-repeat


【解决方案1】:

您可以先编写一个简单的过滤器来提取键:

app.filter('keys', function () {
    return function (object) {
        return Object.keys(object || {}).filter(function (key) {
            return key !== '$$hashKey'; // this is from ng-repeat
        });
    };
});

并像这样使用它:

<div ng-repeat="prop in wines[0] | keys | filter:'!Category'"

示例 JSFiddle: http://jsfiddle.net/1qhba9fs/1/

希望这会有所帮助。

【讨论】:

  • 我还有一个问题,与此解决方案分开(效果很好)如果我想将过滤后的葡萄酒数组分配给 angularjs 或 javascript 中的变量,我该怎么做?我整天都在搞乱它,尝试不同的方法,试图让这些函数之一返回数组,然后回调该函数并将其分配给全局变量。虽然无法弄清楚......但一般的想法是我只是想将过滤后的数组存储在一个变量中......再次感谢,非常感谢任何更多的帮助! @runTarm
  • 我不确定我是否正确理解了您的第一个问题,但我看到您已经完成了filtered=(wines | filter:filterByProperties,您应该可以通过$scope.filtered 访问它。
  • 第二个问题,这是angularjs的一个特性,每当一个digest cycle开始时,它会反复重新评估所有被观察到的表达式,直到没有发现更多变化(稳定)。只要你的表达式跑得快,这不会是一个问题。如果您的过滤器逻辑运行缓慢或列表开始变得非常大,最佳实践是避免在ng-repeat 表达式中使用过滤器,预先在控制器中准备数据并将过滤后的项目分配到不同的范围变量中,然后在ng-repeat 代替。
  • 啊,我明白了……我就是这么想的。问题是我使用了这个示例代码并将它应用到了一个我用完全不同的数据和变量编写的现有 Angular 应用程序中。它工作得很好,但是在这个过程中的某个地方我把事情弄混了,所以如果我尝试访问 $scope.filtered 我会得到未定义的。我想我可以弄清楚那部分。非常感谢您提供有关 ng-repeat 的快速角度教程,非常有用,我很感激。 @runTarm
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2016-06-16
相关资源
最近更新 更多