【问题标题】:Filter Ionic Accordion List过滤离子手风琴列表
【发布时间】:2015-12-18 12:29:12
【问题描述】:

我正在使用 Ionic 开发一个应用程序,并且在某个时候我有一个显示职业名称及其专长的手风琴列表,如下所示:

  • 职业 1
    • 专业 1
    • 专业 2
  • 职业 2
    • 专业 3
    • 专业 4

我需要仅根据专业过滤此列表,如果可能,我希望保留所有组(具有与给定搜索值匹配的专业)在用户输入搜索框时显示。

这是我的看法:

<ion-view view-title="Specialty">
    <ion-content>
        <div class="list list-inset">
            <label class="item item-input">
                <i class="icon ion-search placeholder-icon"></i>
                <input type="text" placeholder="Search Specialty" ng-model="seachSpecialty">
            </label>
        </div>

        <div class="list">
            <div ng-repeat="profession in professions">
                <div class="item item-icon-left"  ng-click="toggleGroup(profession)" ng-class="{active: isGroupShown(profession)}">
                    <i class="icon icon-accessory" ng-class="isGroupShown(profession) ? 'ion-chevron-up' : 'ion-chevron-down'"></i>
                    &nbsp;
                    {{profession.name}}
                </div>
                <div class="item item-icon-left item-accordion" ng-show="isGroupShown(profession)" ng-repeat="specialty in profession.specialties">
                    {{specialty.name}}
                </div>
            </div>
        </div>

    </ion-content>
</ion-view>

这是我的控制器:

    .controller('SpecialtyCtrl', function ($scope, $ionicHistory, $ionicLoading, DataSource) {

    $scope.professions = DataSource.getProfessions();

    $scope.toggleGroup = function (group) {
        if ($scope.isGroupShown(group)) {
            $scope.shownGroup = null;
        } else {
            $scope.shownGroup = group;
        }
    }

    $scope.isGroupShown = function (group) {
        return $scope.shownGroup === group;
    }
})

编辑:

这里是这个代码对应的plunker

所有关于手风琴列表的工作(扩展和折叠)。我的问题是如何在此列表中进行过滤以仅过滤列表的子项(专业)?此列表的自定义过滤器是什么样的?是否可以在过滤列表时保持组扩展?

【问题讨论】:

  • 不清楚是什么问题或您的问题是什么。它有效吗?如果您为此提供 plunkr,您将有更多机会。
  • 你的 plunkr 根本不起作用。至少控制器不见了。

标签: angularjs filter ionic accordion angularjs-filter


【解决方案1】:

诀窍是使用 Angular filter:

首先你注入过滤器,以便它可以在你的控制器中使用:

myApp.controller('SpecialtyCtrl', ['$scope', '$http', '$filter',
function($scope, $http, $filter) {

    var filter = $filter('filter');

然后你像这样扩展你的控制器逻辑:

    function hasMatchingSpecialities(group) {
        return $scope.searchSpecialty &&
            filter(group.specialties,
                {name: $scope.searchSpecialty}).length;
    }

    $scope.isGroupShown = function (group) {
        return $scope.shownGroup === group ||
            hasMatchingSpecialities(group);
    }

您的专业的ng-repeat 可以扩展为使用过滤器:

<div class="item item-icon-left item-accordion" ng-show="isGroupShown(profession)"
  ng-repeat="specialty in profession.specialties | filter: searchSpecialty">
                {{specialty.name}}
</div>

这是Plunkr

【讨论】:

  • 非常感谢!正是我需要的,甚至更好:无需实现自定义过滤器。 isGroupShown(group) 函数的绝妙技巧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多