AngularJS的IE11性能问题

时间:2018-01-10 16:46:18

标签: angularjs internet-explorer

我在使用AngularJS(v1.5.8)应用程序的IE11中遇到了性能问题。由于数据以ng-repeat的形式呈现,IE11会变得浑浊,甚至会暂时冻结。 Chrome可以毫无问题地呈现HTML。

我设置了一个简单示例here on Plunker

<!DOCTYPE html>
<html ng-app="app" ng-controller="MainController">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>App</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
    <style type="text/css">
        .gray {
            background-color: #aaa;
        }
    </style>
</head>
<body>

    <span class="fa fa-spin fa-spinner fa-5x"></span>
    <table>
        <tr ng-repeat="item in arr track by $index" ng-class="{'gray': $index % 2 == 0}" ng-show="$index % 5 != 0">
            <td>{{item.set}}</td>
            <td><input type="checkbox" />{{item.test}}</td>
            <td><input type="checkbox" />{{item.test}}</td>
            <td><input type="checkbox" />{{item.test}}</td>
            <td><input type="checkbox" />{{item.test}}</td>
            <td><input type="checkbox" />{{item.test}}</td>
            <td><input type="checkbox" />{{item.test}}</td>
        </tr>
    </table>

    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>

    <script>

        //Angular module
        var app = angular.module('app', []);

        //Controller
        app.controller('MainController', function ($scope, $timeout) {

            //array for holding dummy data to display in ng-repeat
            $scope.arr = [];

            //How much data do we want?
            for (var i = 1; i < 100; i++) {

                //Add to arr on a delay to simulate web service response time
                $timeout(function (index) {

                    //Add 20 more array items at a time
                    var nextSet = [];
                    for (var j = 0; j < 20; j++) {
                        nextSet.push({ 'set': index, 'test': 'abc' });
                    }

                    $scope.arr = $scope.arr.concat(nextSet);

                }, i * 50, true, i);  //50 is too short in IE 11 and causes freezing.  500 works fine.
            }

        });

    </script>
</body>
</html>

在该示例中,使用$ timeout将数据添加到数组中。在我的实际应用程序中,数据作为Web服务返回数据添加。将示例中的时间从50更改为500可以解决IE11中的问题。我不认为我可以对实际应用程序应用类似的解决方法,因为我不知道Web服务的返回速度有多快。

我的AngularJS应用程序中有什么可以改变以使IE11表现更好吗?我不希望它像Chrome一样光滑,但我希望它比它更好。

1 个答案:

答案 0 :(得分:1)

通过将{{item.test}}语句定义为一次绑定,您可以稍微提高此示例中的性能:{{ :: item.test}} 这将导致AngularJs不再观看更改。