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

改善嵌套的ng-repeat +指令性能

唐哲
2023-03-14
问题内容

我有一个水平月历,显示员工每天的活动。

当前它正在使用具有以下层次结构/流程的表

1)控制器:根据选择的月份/年份,生成一个包含该月每天的数组。$ scope。$ watchCollection每当年份或月份更改时都会更新数组。

如代码所示,我可以做的更好:

<table class="table table-bordered table-condensed" ng-controller="PlanningOverviewController">
    <tr>
        <th><input type="text" ng-model="employeefilter"/></th>
        <th colspan="7" ng-repeat="week in weeks">
            {{week | weekheader}}
        </th>
    </tr>
    <tr>
        <th>&nbsp;</th>
        <th ng-repeat="day in days">
            {{day.format("ddd")}}
        </th>
    </tr>
    <tr>
        <th>&nbsp;</th>
        <th ng-repeat="day in days">
            {{day.date()}}
        </th>
    </tr>
    <tr ng-repeat="employee in planning | filter:employeefilter">
        <td> {{employee.firstName}} {{employee.lastName}}</td>
        <td class="calendar-unit" ng-repeat="day in days" ng-init="assignments = getAssignments(day, employee)">
            <div class="assignment"
                 assignment  ng-repeat="assignment in assignments"
                 assignment-description = "{{assignment.description}}"
                 assignment-period="{{assignment.period}}"
                 assignment-type="{{assignment.type}}">

            </div>
        </td>
    </tr>
</table>

问题在于getAssignments()是“昂贵的”,因为它需要检查:

  1. 是公共假期吗?
  2. 员工在那天工作吗?
  3. 员工有假期吗?
  4. 获取当天的项目任务

每当更改员工列表(由于过滤器)或更改月份时,拥有约40名员工时,表的生成最多需要6秒钟。

还有另一种方法可以解决这个问题,或者改善ng-repeats的嵌套吗?

谢谢,可以澄清是否需要更多信息。

编辑:

我尝试从代码中删除一些元素,以查看导致改进的原因。当我让分配返回一个虚拟值时,渲染效果将提高2-3秒,因此在其中进行一些缓存可能会有所帮助。但是,以这种方式呈现“空”表仍需要3-4秒。

然后,我从指令本身中删除了逻辑,有效地使其变为空,这仍然导致相同的延迟。

但是,当从html中删除指令本身时,该表在更改日期时几乎立即呈现。我是否必须假设这是对角度的(正常?)限制?我不需要静态数据,因为目标是拖动任务。

更新2: 我意识到我一直效率很低…在使用batarang查看范围和绑定+回顾了代码本身之后,我注意到我做的“
getAssignments()”检查太多了,而我的整个方法都是基于“为员工分配工作”,而专注于一天的工作可能会更好/更快。我将在周末更新代码并发布答案(如果它可以改善/解决问题)。

更新3: 重写计划生成方式后,现在需要2秒才能显示50个资源的表。大约有1750条指令(每天至少有1个员工事件)。我认为这是正常的延迟,请参阅大小?

更新4: 指令代码:

angular.module('planning.directives', ["templates.app", "ui.bootstrap", "planning.controllers"])
  .directive("assignment", function () {
    return {
        restrict: "EA",
        replace: true,
        scope: {
            assignmentData: "=",
            assignmentCreateMethod: "&"
        },
        template: '<div class="assignment">{{assignmentData.description}}&nbsp;</div>',
        link: function (scope, element, attrs) {

            element.addClass(scope.assignmentData.type);

            if (scope.assignmentData.period == "am") {
                element.css("width", "50%");
                element.css("float", "left");
            }

            if (scope.assignmentData.period == "pm") {
                element.css("width", "50%");
                element.css("float", "right");
            }

            element.on("mouseenter",function () {
                element.addClass("hover");
            }).on("mouseleave", function () {
                    element.removeClass("hover");
                });

            element.on("click", function() {
                scope.assignmentCreateMethod();
            });
        }
    };
});

问题答案:

在这种情况下,听起来您正在渲染更多的信息,这些信息可以随时显示。因此,您可以:

  • 用某种分页方式重新考虑界面,因此您一次只能渲染一屏信息。或者可能是一次限制显示的周数。

  • 如果某种指令ngIf在屏幕上不可见,则创建某种指令来删除其内容(即通过)。也许在窗口上监听(去抖动的)滚动事件,然后从http://verge.airve.com/调用函数以测试它的任何部分是否可见。在这种情况下,整理元素的垂直大小可能很棘手,因此,它在某种程度上取决于您的用例。

为了澄清,这将必须在内容被Angular渲染之前删除,而不仅仅是隐藏元素。



 类似资料:
  • 问题内容: 我有一些虚拟XML文件: 使用此库http://code.google.com/p/x2js/将其转换为json,并转换为变量 Day可以具有任意数量的Job,Job可以嵌套并且包含任意数量的其他Job。 现在使用此代码 我可以列出有效的日期。我希望使用以下代码 我可以列出当天的工作日和最高职位,但这是行不通的。(要列出嵌套的Jobs,将是下一个任务,而不是现在询问该任务)。 那么,如

  • 问题内容: 我想在内容更改时创建具有自定义行为的列表。我尝试为此创建一个指令,但是我对如何将ng-transclude与ng- repeat指令结合起来感到迷茫。有人可以让我走上正轨吗? HTML: Javascript: 我已经在这里工作了一部分 编辑: 条件: 该项目的模板必须在视图中定义,而不是在指令中定义,并且必须有权访问子作用域中的项目属性。理想情况下,我想像在ng-repeat指令中那

  • 问题内容: 我有一个JSON对象,表示为: 我需要在 第二 层上做一个中继器,列出“虚假”数字。 我已经知道如何获得最高水平 但是我不清楚循环降级的顺序。例如,这是错误的: 我也知道如何 嵌套 中继器来实现这一点,但是在这种情况下,我根本不需要显示顶层。 澄清说明 这里的目标是有一个带有4个“伪”数字的列表(每个包裹有2个,顺序中有2个包裹)。 问题答案: 大量搜索不错的简单解决方案以进行动态迭代

  • 问题内容: 我想知道是否存在针对此类问题的简单解决方案。 我有一个对象注释,该对象注释又可以包含注释,并且这些注释也可以包含注释…并且此操作可以进行未知数量的循环。 这是数据结构的示例: 可以说我会写2级评论: 我该如何使div的嵌套注释达到“ n”级? 问题答案: 最简单的方法是创建通用部分,以便您可以使用递归调用和呈现它。 这是局部的: 数据模型应为列表。 我为您创建了一个演示,希望对您有所帮

  • 问题内容: 我在另一个ng-repeat中嵌套了一个ng-repeat。我想在单击按钮时将一些值推入第二个数组 谁可以帮我这个事。谢谢 问题答案:

  • 问题内容: 我花了一段时间试图找到一个优雅的解决方案,而我却找到了一个“可行”的解决方案,它感觉不是最简单或正确的做事方式。 所以,我的问题是…如何动态加载指令!在某些情况下,以下是我希望我能摆脱它的方式!除了模板加载之外,我没有包含路由或其他任何内容,而是为下面的控制器分配了ng- controller。 app.js template.html 任何人都可以提供的建议将不胜感激,如果我做任何明