【问题标题】:Filtering ng-repeat list using checkboxes and AngularJS使用复选框和 AngularJS 过滤 ng-repeat 列表
【发布时间】:2014-03-08 13:58:05
【问题描述】:

我已经阅读了很多关于此的其他帖子,它们都倾向于描述独特而复杂的解决方案。我只想根据我单击的复选框过滤项目列表(我需要一个“AND”过滤器并能够在单击复选框之前看到所有项目)。

这看起来应该是 AngularJS 的小菜一碟,但我就是不明白。如何修改我的代码以使过滤工作?

这是我不完整的 JSFiddle:http://jsfiddle.net/mromrell/qx3cD/1/

这里更新了小提琴http://jsfiddle.net/mromrell/qx3cD/7/

提前感谢您!

<div ng-controller="MyCtrl">
<li class="no-decoration" ng-repeat="tech in technologyArray">
    <label>
        <input type="checkbox" ng-model="strict" />{{tech}}</label>
</li>
<hr>
<div ng-repeat="portfolioItem in portfolioArray | filter:strict" class="ng-scope">
     <h3>{{portfolioItem.name}}</h3>

</div>

var myApp = angular.module('myApp', []);

function MyCtrl($scope) {
    $scope.technologyArray = ["HTML", "CSS", "Django", "Python", "AngularJS", "Javascript", "3rd party Payment API", "3rd party Libraries", "Jquery", "RestfulAPI", "AAAAAHH", "NodeJS", "Mongo", "Express", "Jade", "Wordpress", "MySQL", "Joomla", "Magento", "Jira"]

$scope.portfolioArray = [{
    "id": "1",
    "name": "Storm Pig",
    "technology": ["HTML", "CSS", "Django", "Python", "AngularJS", "Javascript", "3rd party Payment API", "3rd party Libraries"]
}, {
    "id": "2",
    "name": "Placer",
    "technology": ["HTML", "CSS", "Django", "Python", "AngularJS", "Javascript", "Jquery"]
}, {
    "id": "3",
    "name": "Custom Proposal App",
    "technology": ["RestfulAPI", "AAAAAHH", "AngularJS", "HTML", "CSS", "Javascript", "NodeJS", "Mongo", "Express", "Jade"]
}, {
    "id": "4",
    "name": "21 Zero",
    "technology": ["HTML", "CSS", "Wordpress", "MySQL"]
}, {
    "id": "5",
    "name": "Detour Journal",
    "technology": ["HTML", "CSS", "Joomla", "MySQL"]
}, {
    "id": "6",
    "name": "Dex Custom Websites",
    "technology": ["HTML", "CSS", "Wordpress", "MySQL", "Magento", "Jira"]
}, {
    "id": "7",
    "name": "Conversion Jump",
    "technology": ["HTML", "CSS", "Joomla", "MySQL"]
}, {
    "id": "8",
    "name": "The Canyons Pass",
    "technology": ["HTML", "CSS", "Joomla", "MySQL"]
}]

}

【问题讨论】:

    标签: arrays angularjs checkbox filter angularjs-filter


    【解决方案1】:

    我想我已经用一种相当简单的方式解决了它:http://jsfiddle.net/qx3cD/4/

    您遇到的问题是复选框适用于真/假值系统,而基本过滤器正在寻找匹配数据。因此,您需要创建某种自定义过滤器来将复选框状态映射到数据本身。我使用了这个基本功能,它只是将复选框状态与其对应的名称进行比较,以及它们是否与技术列表相关联。

    $scope.myFunc = function(a) {
        for(tech in $scope.technologyArray){
            var t = $scope.technologyArray[tech];
            if(t.on && a.technology.indexOf(t.name) > -1){
                return true;   
            }               
        }
    };
    

    编辑:更新

    我在这里更新了小提琴:http://jsfiddle.net/qx3cD/9/

    基本上做了两件事。第一个是使用ng-change 监视复选框,以便在未选中任何复选框时显示所有结果。第二个是过滤器功能已更新为仅显示包含所有所选技术的项目。

    【讨论】:

    • 这功能很棒。我唯一的问题是,在单击复选框之前,如何让它最初显示所有项目。并充当“与”过滤器(因此,如果单击三种技术,则仅显示具有所有这三种技术的那些项目)?我根据您的建议更新了我的小提琴:jsfiddle.net/mromrell/qx3cD/7
    • 太完美了!这正是我希望做的,而且非常有意义。我认为您刚刚创建了我看过的 10 多个其他示例中最简单的示例。谢谢!!
    • 我已经通过 jsfiddle 检查了建议的解决方案。它给了我“ReferenceError: t is not defined”错误。你能帮忙吗?
    • 我刚刚检查了小提琴,对我来说似乎很好。
    • @MattWay 我使用了您的解决方案来过滤一个巨大的表格,并且效果很好。我唯一的问题是我无法跟踪过滤对象的数量。我不想创建任何新数组并将过滤后的对象推送给它。有什么简单的方法吗?
    猜你喜欢
    • 2016-12-06
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多