【问题标题】:Nested ng-repeat doesn't work in IE8嵌套的 ng-repeat 在 IE8 中不起作用
【发布时间】:2015-11-30 20:56:40
【问题描述】:

我在 AngularJS 1.2.28 中有一个单页应用程序,我正在努力让它在 IE8 中正常工作。

特别是我有一个嵌套ng-repeats 的问题,用于显示在以下MainController 中声明的bigObject

angular.module('singlePageApp')
  .controller('MainController',
    ['$scope',
    function ($scope) {
        $scope.showLittleObjectsList = false;
        $scope.bigObject = {
        objects: [
            {
                name: "NAME1",
                metadata: [

                    {index: 0, desc: "metadataQ"},
                    {index: 0, desc: "metadataF"},
                    {index: 1, desc: "metadataZ"},
                    {index: 1, desc: "metadataL"}

                ]
            },
            {
                name: "NAME2",
                metadata: [

                    {index: 0, desc: "metadataH"},
                    {index: 0, desc: "metadataX"}

                ]
            },
            {
                name: "NAME3",
                metadata: [

                    {index: 0, desc: "metadataU"},
                    {index: 1, desc: "metadataG"},
                    {index: 2, desc: "metadataS"},
                ]
            },
            {
                name: "NAME4",
                metadata: [

                    {index: 0, desc: "metadataK"},
                    {index: 1, desc: "metadataR"},
                    {index: 1, desc: "metadataW"},
                    {index: 2, desc: "metadataN"},    
                    {index: 2, desc: "metadataC"}

                ]
            }
            ]
        };
}]);

主要的 HTML 块是这样的(请注意,showLittleObjectsList = false; 在控制器的开头,仅用于向用户显示列表):

<div ng-repeat="littleObject in bigObject.objects | orderBy:'name':false">
    <div>
        <button type="button" class="btn btn-default btn-sm" ng-click="showLittleObjectsList = !showLittleObjectsList">
            <span class="glyphicon glyphicon-chevron-right" ng-hide="showLittleObjectsList"></span>
            <span class="glyphicon glyphicon-chevron-down" ng-show="showLittleObjectsList"></span>
        </button>
        <span>{{littleObject.name}}</span>
    </div>
    <div ng-show="showLittleObjectsList">
        <div>
            <div ng-include="'path/to/singledata/template.html'"></div>
        </div>
    </div>
</div>

单个数据的template.html是这样的(groupBy过滤器属于angular-filter):

<div ng-repeat="(key, metadata) in littleObject.metadata | groupBy:'index'">
    <div ng-show="$first">
        <strong>
            Metadatum desc
        </strong>
    </div>
    <div ng-repeat="metadatum in metadata">
        <div>
            {{metadatum.desc}}
        </div>
    </div>
</div>

所有这些代码在 Chrome、Firefox 甚至 IE11 中都运行良好,给了我这样的东西(以前的 v 用于插入符号,因为 showLittleObjectsList = true;):

v NAME1
________________________________________
|   Metadata desc:                      |
|   metadataA                           |
|   metadataF                           |
|   metadataZ                           |
|   metadataL                           |
|_______________________________________|

v NAME2
________________________________________
|   Metadata desc:                      |
|   metadataH                           |
|   metadataX                           |
|_______________________________________|

v NAME3
________________________________________
|   Metadata desc:                      |
|   metadataU                           |
|   metadataG                           |
|   metadataS                           |
|_______________________________________|

v NAME4
________________________________________
|   Metadata desc:                      |
|   metadataK                           |
|   metadataR                           |
|   metadataW                           |
|   metadataN                           |
|   metadataC                           |
|_______________________________________|

遗憾的是,在 IE8 中,最里面的 ng-repeat 坚持使用第一个 littleObject 的元数据,给了我这样的信息:

v NAME1
________________________________________
|   Metadata desc:                      |
|   metadataA                           |
|   metadataF                           |
|   metadataZ                           |
|   metadataL                           |
|_______________________________________|

v NAME2
________________________________________
|   Metadata desc:                      |
|   metadataA                           |
|   metadataF                           |
|   metadataZ                           |
|   metadataL                           |
|_______________________________________|

v NAME3
________________________________________
|   Metadata desc:                      |
|   metadataA                           |
|   metadataF                           |
|   metadataZ                           |
|   metadataL                           |
|_______________________________________|

v NAME4
________________________________________
|   Metadata desc:                      |
|   metadataA                           |
|   metadataF                           |
|   metadataZ                           |
|   metadataL                           |
|_______________________________________|

我怎样才能让它在 IE8 中工作?


小编辑

为解决这个问题,我尝试不使用ng-include 代替singledata/template.html,而是粗暴地将该部分包含在主HTML 中,现在看起来像这样:

<div ng-repeat="littleObject in bigObject.objects | orderBy:'name':false">
    <div>
        <button type="button" class="btn btn-default btn-sm" ng-click="showLittleObjectsList = !showLittleObjectsList">
            <span class="glyphicon glyphicon-chevron-right" ng-hide="showLittleObjectsList"></span>
            <span class="glyphicon glyphicon-chevron-down" ng-show="showLittleObjectsList"></span>
        </button>
        <span>{{littleObject.name}}</span>
    </div>
    <div ng-show="showLittleObjectsList">
        <div>
            <div ng-repeat="(key, metadata) in littleObject.metadata | groupBy:'index'">
                <div ng-show="$first">
                    <strong>
                        Metadatum desc
                    </strong>
                </div>
                <div ng-repeat="metadatum in metadata">
                    <div>
                        {{metadatum.desc}}
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

很遗憾,这并不能解决问题。


编辑

目标的一个重要部分是显示列表及其metadataindex 分组。我添加了完整的控制器代码,并最终修改了 metadata 索引以使分组更有意义。

【问题讨论】:

  • 我不认为你需要支持 IE8,许多 Angular 特性在 IE8 中无法使用,这取决于你让你的生活更艰难:)
  • 显然我必须使用 IE8 (:
  • 事实上,现在仍然有客户不关心升级他们的 SO,因为原因,所以最终还是要他们意识到你所说的;在那之前,经验法则总是一样的:有钱的客户才是你真正的老板,你必须让你的产品适合他的系统才能得到他的钱。
  • 这是一种奇怪的使用 ng-click ng-click="!showLittleObjectsList" 的方式
  • 感谢@YOU,实际上我必须对其进行一些修改才能使其正常工作;我对细节的懒惰有时是压倒性的,虽然。

标签: html angularjs loops internet-explorer-8 angularjs-ng-repeat


【解决方案1】:

我看到在我的身上发生了非常相似的事情,我在其中对数据进行分组,然后在该组上使用 ng-repeat。遗憾的是,我找到的唯一解决方案是创建自己的函数,该函数返回一个扁平列表。

问题(我认为)是 ie-8 的功能不足以保持范围内的重复和超时,通过使用一个函数,它只会执行一次计算,从而降低所需的原始处理能力。

只是为了提供帮助,这是我创建的分组函数,我已经对其进行了修改,以便它可以与上面的数据一起使用,只需调用该函数,然后对组进行重复。

         $scope.generateGroups = function(littleObject) {
            $scope.groups = [];
            var options = [];
            littleObject.metadata.forEach(function (item, index) {
                    var groupIndex = $.inArray(item['index'], options);
                    if (groupIndex >= 0) {
                        $scope.groups[groupIndex].push(item);
                    } else {
                        options.push(item['index']);
                        var test =  [item];
                        $scope.groups.push(test);
                    }
            });
            $scope.apply();
        }

【讨论】:

  • 感谢您对分组功能的编码;我会尽快尝试您的解决方案。
【解决方案2】:

我不确定,但在我之前的一个项目中遇到了类似类型的问题,其中 ng-repeat 中的“track by”修复了问题。请通过添加来检查

(key, metadata) in littleObject.metadata | groupBy:'index' track by $index

希望这能解决您的问题。

【讨论】:

  • 不幸的是,这似乎对我不起作用;我尝试了您的解决方案,然后我尝试在ng-repeat="metadatum in metadata" 中使用track by $index,最终我尝试同时使用这两种方法,但效果不佳,问题不断出现。
猜你喜欢
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多