【发布时间】:2013-06-09 09:27:47
【问题描述】:
我在表行上使用 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);
}
]
);
【问题讨论】:
-
感谢您的提问。有同样的问题,很容易与你的问题联系起来并理解答案
标签: javascript angularjs angularjs-ng-repeat