使用过滤隐藏AngularJS中的子类别

时间:2014-06-23 11:32:57

标签: javascript angularjs

我有一个内容列表,它有两个级别。我的数据已经排序,所以我只是迭代它来显示它。所以我有这个

Category 1
  Subcategory1
     Item1
     Item2
  Subcategory2
     Item3
     Item4
  Subcategory3
     Item5
     Item6
  Subcategory4
     Item7
     Item8
Category 2
  Subcategory1
     Item9
     Item10
  Subcategory2
     Item11
     Item12

等等。我还有一个文本过滤器,因此您可以根据标题和标签输入文本和我的内容列表过滤器。一切正常。我想要做的是隐藏类别2中的子类别1,如果过滤器排除了Item9和Item10。我有2500件物品,它已经有点慢了。而不是再次计算项目,我想在过滤它们时计算它们。这意味着当过滤器启动时,我需要重置我的列表,然后在找到项目时进行计数。我有两个控制器,父项中有文本框,子项用于每个项目,因为我读的比使用过滤器更快(因为过滤器从DOM中删除了东西)。我还不确定它是否属实,我正在试验。与此同时,这是在父控制器中:

$scope.doFilter = function()
{
    for (var c = 0; c < $scope.categories.length; ++c)
    {
        var categoryId = $scope.categories[c].Id;


        for (var r = 0; r < $scope.regions.length; ++r)
        {
            var regionId = $scope.regions[r].Id;
            $scope.showRegions[String(categoryId) + String(regionId)] = 0;
        }
    }


    $scope.$broadcast("triggerFilters", {});
}

然后这是我在子控制器中搜索方法的底部:

    if (!excluded)
    {
        var key = String($scope.item.CategoryId) + String($scope.region.Id);

        if ($scope.$parent.showRegions[key] == null)
            $scope.$parent.showRegions[key] = 0;

        $scope.$parent.showRegions[key]++;
    }

请记住,有一个这个子控制器的实例,对于每个元素,它都是这样的(这是一个减少版本,为了便于阅读):

<div data-ng-repeat="category in fullList">
        <a>{{category.Name}}</a>
        <div >
            <div data-ng-repeat="region in regions | orderBy: 'Name'">
                {{region.Name}}
                <div >
                    <ul>
                        <li  ng-controller="filterController" ng-hide="isExcludedByFilter"
                            data-ng-repeat="item in category.regions[region.Name].items | orderBy: 'Name'">
                            {{item.Name}}
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

因此,当我在Chrome中设置断点时,我可以看到我的项目计数集合在增长。但Chrome中的Angular检查员会冻结(也许是因为我有2500个控制器?)如果我在推送搜索时调用的方法设置了一个断点,那么这些集合都会再次为空。因此,我尝试添加过滤器,但是如果我添加了一个ng-hide,则列表永远不会显示,因为该集合始终为空,尽管它会在搜索发生时填满。

我使用的是$ parent,因为每个项目都有它自己的控制器,我想如果你修改了父项,你会得到一个本地副本。所以,这显然是有效的,但是当搜索结束时价值正在消失,我不知道为什么。

感谢您寻找

1 个答案:

答案 0 :(得分:0)

好的 - 我把它排除了。 Angular在每个范围的级别维护变量,因此子范围继承了一个值,但是如果在子级别更改它,则父级别将保持不变,除非您使用$ scope。$ parent。随着我对Angular的了解越来越多,我的项目也在不断发展。我没有完全意识到我的数据项有两个嵌套的范围。所以,我需要更改$ scope。$ parent,$ scope。$ parent。$ parent,一切都很好。现在我只需要弄清楚为什么它这么慢......