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

DOM中的元素过多时,Angular ng级性能问题

贾骏
2023-03-14
问题内容

我一直在处理导致性能问题的复杂角度页面。为了强调这个问题,我在这里创建了一个小提琴http://jsfiddle.net/4ex2xgL1/3/。

本质上,性能问题是由其中具有功能的ng-class语句引起的。

<span class="done-{{todo.done}}" ng-class="myfunction()">{{todo.text}}</span>

跨度为ng-repeat。在运行小提琴时,您可以看到ng-class在页面加载时被执行了几次,并且在每个键上被调用的次数与TODO列表中的项目数一样多。

这是一个简单得多的案例,以我为例,我的页面上有780个项目,该函数最终被评估了3000次!

我们看到的解决方案之一是打破范围,但这几乎会导致我的应用程序被重写。

我们还尝试了https://github.com/Pasvaz/bindonce,但它似乎不适用于高度动态的内容。

有什么想法吗?


问题答案:

最终,我找到了解决方案,它将大大提高angular js的性能。

如果您的模型动态变化,并且您有大量数据,那么它也可以使AngularJS页面的显示率提高1000%甚至更多-别开玩笑!

有关更多信息,您可以访问:http : //orangevolt.blogspot.in/2013/08/superspeed-your-
angularjs-apps.html

按照步骤:

  1. 从链接下载库:库

2.没有库的示例:(请检查您的控制台)

function MyController( $scope) {

    var entries = [

        { label : 'one', value : 'first entry'},

        { label : 'two', value : 'second entry'},

        { label : 'three', value : 'third entry'}

    ];



    $scope.label ="";

    $scope.value ="";

    $scope.order = 'label';



    $scope.add = function() {

        entries.push({

            label : $scope.label,

            value : $scope.value

        });

    };



    $scope.getEntries = function() {

        console && console.log( "getEntries() called");

        return entries;

    };

}


<script src="https://raw.githubusercontent.com/lodash/lodash/2.4.1/dist/lodash.js"></script>

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>



<form name="myform" ng-app ng-controller="MyController">

    Label/Value :

    <input type="text" required ng-model="label">

    <input type="text" required ng-model="value">

    <button

        ng-disabled="!myform.$valid"

        ng-click="add()"

    >Add</button>



    <fieldset>

        <legend>

            Entries sorted by

            <select

                ng-model="order"

                ng-options="property for property in [ 'label', 'value']">

            </select>

        </legend>

        <div ng-repeat="entry in getEntries() | orderBy:order">

            {{entry.label}} = "{{entry.value}}"

        </div>

    </fieldset>

</form>

3.带库的示例:(检查您的控制台)

function MyController( $scope) {

    var entries = [

        { label : 'one', value : 'first entry'},

        { label : 'two', value : 'second entry'},

        { label : 'three', value : 'third entry'}

    ];



    $scope.label ="";

    $scope.value ="";

    $scope.order = 'label';



    $scope.add = function() {

        entries.push({

            label : $scope.label,

            value : $scope.value

        });

            // clear cache

        $scope.getEntries.cache = {};

    };



    $scope.getEntries = _.memoize(

        function() {

            console && console.log( "getEntries() sorted by '" + $scope.order + " 'called");

                // return entries sorted by value of $scope.order

            return _.sortBy( entries, $scope.order);

        },

        function() {

                // return the cache key for the current result to store

            return $scope.order;

        }

    );

}


<script src="https://raw.githubusercontent.com/lodash/lodash/2.4.1/dist/lodash.js"></script>

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>



<form name="myform" ng-app ng-controller="MyController">

    Label/Value :

    <input type="text" required ng-model="label">

    <input type="text" required ng-model="value">

    <button

        ng-disabled="!myform.$valid"

        ng-click="add()"

    >Add</button>



    <fieldset>

        <legend>

            Entries sorted by

            <select

                ng-model="order"

                ng-options="property for property in [ 'label', 'value']">

            </select>

        </legend>

        <div ng-repeat="entry in getEntries()">

            {{entry.label}} = "{{entry.value}}"

        </div>

    </fieldset>

</form>


 类似资料:
  • 有没有可能用蟒蛇硒在阴影DOM中找到元素? 示例用例: 我用输入了这个

  • 我有一个名为的简单函数: 我想知道除了这个以外,是否还有其他方法可以添加某些属性的值:等于,等于等。 我试过这样的方法: 但那行不通。我知道尝试它可能是愚蠢的(因为我的IDE说这个表达式不能分配给类型HTML元素^^')。

  • 我正在编写一个jQuery插件,它需要能够在iframe中针对DOM元素运行。我现在只是在本地测试这个(即url是file://.../example.html),在Chrome中,我一直按“安全错误:未能从”htmliframeElement“中读取”内容文档“属性:阻止一个来源为”null“的框架访问跨来源的框架。”在Safari中,我只得到一个空文档。 如果父文件和iframe文件都从我的本

  • 我有一个来自服务器的响应,我想把它放到列表中。但是当列表为空时,我需要隐藏这个div容器。例如,如果不在数组中-我想隐藏div。但是我想在ng之后使用bird重复,所以我不能使在上。我可以检查li是否为空,然后隐藏div吗? 普朗克例子 AngularJS ng-重复处理空列表大小写-这是不一样的。如果li是空的,我不想隐藏li,我想在li是空的时候隐藏父元素h1。

  • 我可以通过以下方式访问dev中的用户名: 有没有其他方法可以通过webdriver访问ShadowDOM元素?

  • 我使用Thymeleaf创建html组件。组件在单独的文件中声明: 中基本按钮的声明 这个想法是为组件提供某种类型的工具集。使用此组件的代码将是: 它运行良好,但我考虑了按钮需要具有以下属性的情况:或或任何其他属性。问题来了: 如何将属性传递给按钮? 一种方法是将其作为片段的参数传递,但它太丑了。 有什么方法可以获取片段中占位符的属性吗?(见下面的示例) 我想这样调用片段: 并且在片段中想要获取这