当前位置: 首页 > 面试题库 >

AngularJS按指令分组,没有外部依赖性

阎兴为
2023-03-14
问题内容

我是Angular的新手,我想学习处理问题的最佳方法。我的目标是要有一种可重复使用的方式来创建标题组。我创建了一个可行的解决方案,但我认为这应该是指令,而不是控制器中的作用域函数,但是我不确定如何实现此目标,或者不确定指令是否正确。任何输入将不胜感激。

看到我目前在jsFiddle上工作的方法

在HTML中,这是一个使用ng-repeat的简单列表,其中我在ng-show上调用了newGrouping()函数。该函数传递对完整列表,我要分组的字段以及当前索引的引用。

<div ng-app>
<div ng-controller='TestGroupingCtlr'>
    <div ng-repeat='item in MyList'>
        <div ng-show="newGrouping($parent.MyList, 'GroupByFieldName', $index);">
            <h2>{{item.GroupByFieldName}}</h2>
        </div>
        {{item.whatever}}
    </div>
</div>
</div>

在我的控制器中,我有newGrouping()函数,该函数将当前值与前一个值进行比较,除了第一项之外,并根据匹配项返回true或false。

function TestGroupingCtlr($scope) {

  $scope.MyList = [
    {GroupByFieldName:'Group 1', whatever:'abc'},
    {GroupByFieldName:'Group 1', whatever:'def'},
    {GroupByFieldName:'Group 2', whatever:'ghi'},
    {GroupByFieldName:'Group 2', whatever:'jkl'},
    {GroupByFieldName:'Group 2', whatever:'mno'}
  ];

  $scope.newGrouping = function(group_list, group_by, index) {
  if (index > 0) {
    prev = index - 1;
    if (group_list[prev][group_by] !== group_list[index][group_by]) {
      return true;
    } else {
      return false;
    }
  } else {
    return true;
  }
  };
}

输出将如下所示。

第一组

  • abc
  • def

2组

  • jkl
  • k
  • mno

感觉应该有更好的方法。我希望这是我可以重用的通用实用程序功能。这应该是指令吗?有比我传递完整列表和当前索引的方法更好的方法来引用列表中的上一项吗?为此,我将如何处理指令?

任何意见是极大的赞赏。

更新:寻找不需要外部依赖项的答案。使用下划线/破折号或角度过滤器模块有很好的解决方案。

达里尔


问题答案:

这是对以上Darryl解决方案的修改,它允许使用多个by group参数。另外,它使用$ parse允许将嵌套属性用作按参数分组。

使用多个嵌套参数的示例

http://jsfiddle.net/4Dpzj/6/

的HTML

<h1>Multiple Grouping Parameters</h1>
<div ng-repeat="item in MyList  | orderBy:'groupfield' | groupBy:['groupfield', 'deep.category']">
    <h2 ng-show="item.group_by_CHANGED">{{item.groupfield}} {{item.deep.category}}</h2>
     <ul>
        <li>{{item.whatever}}</li>
     </ul>
</div>

过滤器(JavaScript)

app.filter('groupBy', ['$parse', function ($parse) {
    return function (list, group_by) {

        var filtered = [];
        var prev_item = null;
        var group_changed = false;
        // this is a new field which is added to each item where we append "_CHANGED"
        // to indicate a field change in the list
        //was var new_field = group_by + '_CHANGED'; - JB 12/17/2013
        var new_field = 'group_by_CHANGED';

        // loop through each item in the list
        angular.forEach(list, function (item) {

            group_changed = false;

            // if not the first item
            if (prev_item !== null) {

                // check if any of the group by field changed

                //force group_by into Array
                group_by = angular.isArray(group_by) ? group_by : [group_by];

                //check each group by parameter
                for (var i = 0, len = group_by.length; i < len; i++) {
                    if ($parse(group_by[i])(prev_item) !== $parse(group_by[i])(item)) {
                        group_changed = true;
                    }
                }


            }// otherwise we have the first item in the list which is new
            else {
                group_changed = true;
            }

            // if the group changed, then add a new field to the item
            // to indicate this
            if (group_changed) {
                item[new_field] = true;
            } else {
                item[new_field] = false;
            }

            filtered.push(item);
            prev_item = item;

        });

        return filtered;
    };
}]);


 类似资料:
  • 我需要在我的maven项目中添加大约15个罐子,它在远程和中央存储库中都不可用。 然而,我实现了以下目标:, > 在我的项目路径中添加了jars(\src\lib) 将pom更改如下, 我的问题是: 我是否需要像上面那样分别对所有15个JAR重复它,或者我们有任何其他方法来绑定这些JAR并将其作为一个依赖路径? Maven在这里讨论了同样的事情:指向多个JAR的系统依赖性。但我想知道我是否能得到更

  • 问题内容: 我正在尝试在Angular中实现d3指令,这很困难,因为在视觉上什么也没有发生,并且在控制台上没有抛出任何错误。 这是我的d3指令: 这是我的HTML: 起初我以为不是要附加,因为要检查看起来像的元素,但是现在我认为该指令根本没有在运行。我从一开始就将其嵌入其中,也没有出现。我缺少简单的东西吗? 编辑: 我尝试将顶行更改为 但这也不起作用。我什至不知道两个标题之间有什么区别… 问题答案

  • 如您所知,Maven使用存储库的概念进行依赖关系管理。 但是,如果在任何远程存储库和中央存储库中都没有依赖项,会发生什么? Maven使用External Dependency概念为这种情况提供答案。 例如,让我们对“创建Java项目”一章中创建的项目进行以下更改。 将lib文件夹添加到src文件夹。 将任何jar复制到lib文件夹中。 我们使用了ldapjdk.jar ,它是LDAP操作的帮助库

  • 我熟悉使用make构建大型应用程序,但现在我已经开始使用Android Studio,我想了解如何在Makefile中完成我已经做过的事情。 下面是一个可能有助于您确定答案的示例: Makefile示例:(极简主义) 更简单的例子: 在Gradle怎么做? 我想解决上面示例中提到的外部依赖关系。实际上,我是通过“make”来实现的,但我想完全删除这个额外的步骤。

  • 本文向大家介绍OCaml 没有外部依赖关系的基本示例,包括了OCaml 没有外部依赖关系的基本示例的使用技巧和注意事项,需要的朋友参考一下 示例 如果您的项目没有外部依赖关系,并且具有foo.ml主要入口点,则可以使用以下命令编译字节码版本 要获取本机可执行文件,请运行            

  • 问题内容: 可以说我有一个简单的angular指令,如下所示: 如何使用Typescript编写此代码并在链接函数中获得$ timeout可访问的权限?我的示例如下所示: 这可能是一个愚蠢的示例,但这是我想开始使用的原理,它是在角度链接函数中使用注入的依赖项。 问题答案: 尝试这种方式: 您现在拥有的方式可能有问题。由于未更新指令工厂,因此其构造函数将作为全局对象执行。这样,你就不会最终有一个巨大