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

AngularJS:具有动态列表的ng-repeat,而无需重建整个DOM树?

汝飞
2023-03-14
问题内容

我在表格行上使用ng-
repeat,其中包含从服务器检索到的JSON数组中的数据。我的目标是在服务器上添加,删除或修改项目时自动更新列表,而不会影响未修改的项目。在最终实现中,这些表行还将包含双向绑定的<input><select>元素,用于将更新发送回服务器。<select>元素中的某些可用选项也将使用另一个可能也会更改的列表中的ng-
repeat指令生成。

到目前为止,每次从服务器收到一个新数组(当前每两秒钟轮询一次),整个ng-
repeat列表都会被删除并重新生成。这是有问题的,因为它会干扰文本选择,即使用户当前正在编辑输入字段,也会破坏输入字段,并且运行速度可能比必要的慢得多。

我已经编写了其他Web应用程序,这些应用程序使用jQuery和DOM操作实现了我想要的功能,但是代码最终变得非常繁琐,开发非常耗时。我希望使用AngularJS和数据绑定在短短的代码和时间内完成此任务。

因此,这里的问题 是否可以通过这种方式更新后备数组,但仅修改与实际更改的项/属性相对应的DOM元素?

这是一个最小的测试用例,它使用计时器中的硬编码数组来模拟定期轮询(请参见http://jsfiddle.net/DWrmP/实时查看)。请注意,由于删除和重新创建了元素,因此每500毫秒将清除一次文本选择。

HTML

<body ng-app="myApp">
    <table ng-controller="MyController">
        <tr ng-repeat="item in items | orderBy:'id'">
            <td>{{item.id}}</td>
            <td>{{item.data}}</td>
        </tr>
    </table>
</body>

JavaScript

angular.module('myApp', []).controller(
    'MyController', [
        '$scope', '$timeout',
        function($scope, $timeout) {
            $scope.items = [
                { id: 0, data: 'Zero' }
            ];

            function setData() {
                $scope.items = [
                    { id: 1, data: 'One' },
                    { id: 2, data: 'Two' },
                    { id: 5, data: 'Five' },
                    { id: 4, data: 'Four' },
                    { id: 3, data: 'Three' }
                    ];
                $timeout(setData, 500);
            }
            $timeout(setData, 500);
        }
        ]
);

问题答案:

对于那些从Google找到此功能的人,下面的页面介绍了AngularJS 1.2中的一项功能,可帮助解决此问题:

http://www.bennadel.com/blog/2556-Using-Track-By-With-ngRepeat-In-
AngularJS-1-2.htm

编辑添加: 如果链接消失,则链接文章中最重要的句子:

使用新的“ track
by”语法,我现在可以告诉AngularJS应该使用哪个对象属性(或属性路径)来将JavaScript对象与DOM节点相关联。这意味着只要“ track
by”关联仍然有效,我就可以换出JavaScript对象而不破坏DOM节点。



 类似资料:
  • 问题内容: 嗨,我有一个简单的ng-repeat-start和end用例,并且工作正常,当我想添加一个内部ng-repeat时出现了问题。这是我的代码 内部ng-repeat到td元素中不起作用,在检查html源代码时看到ngRepeat注​​释,但未创建td元素。 我的丑陋的解决方法(假设我知道该向量的大小)是: 问题答案: 从那时起,我不确定是否使用角度1.1.6,并且在1.1.5或1.0.7

  • 问题内容: 如何在ng-repeat中使用动态名称命名表单? 我想动态命名每种形式。例如,将$ index添加到表单名称。我该如何实现?我在ng-repeat上尝试了ng-init,但是没有用。 问题答案: 您可以这样做: 编辑 : 您也可以使用,如下所示: 如果仅基于表单的有效性应用类,则可以将样式应用于自动添加的类,例如:

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

  • 问题内容: 在遍历数据后,我遇到一些有关DOM操作的问题。 我们有一个与数据绑定并且可以正常工作的jQuery滑块插件,但是当使用时,我们必须将其初始化包装起来以使其起作用—现在甚至不起作用。 我认为使用是不可靠的,这将导致错误的修复。在jQuery中,我可以使用-这很可靠,但是使用似乎也不起作用。 调用了Slider指令,但由于没有将图像加载到DOM中而无法获得滑块中图像的高度-导致滑块的计算高

  • 问题内容: 我有一个HTML表格,想通过单击表格标题(在ctrl中)对记录(在ctrl中)进行排序, 任何人都可以解释为什么这样做有效: 那不是: 这是记录的代码: 我的表格中有58列,因此遍历表格标题会更好。 问题答案: 正如David所建议的,这可能与范围有关。由于ngRepeat创建了一个新的作用域,因此您需要为每个列标题设置和。 确保您在同一范围内修改值的一种方法是在该范围内创建一个函数,

  • 我有一个动态JSON,其中包含名称列表,它还包含子名称作为子集。如何使用angularJS ng重复在超文本标记语言UI中显示它 示例动态JSON是 注意:JSON是基于请求生成的。子数组是可选的,它可以包含长度“n”