【发布时间】:2016-04-08 01:01:24
【问题描述】:
我有以下使用 Angular js 的应用程序,我正在使用它来学习它。我有一个行表,我想动态地将新行添加到表中。当我单击添加按钮时,会创建一个新行,由于某种原因,有时位置不正确。也许该行的内部计数器被搞砸了,但我看不出这是如何发生的,或者为什么会发生......?
重建步骤:
- 单击第一个“添加”按钮 - 请注意它正下方的新行。
- 单击第二个“添加”按钮 - 请注意它正下方的新行。
- 单击第三个“添加”按钮 - 注意位置与预期不符(?)
我这里有一个 plunker
https://plnkr.co/edit/WA2K8TNuEE6blNB6zBvZ?p=preview
谁能明白为什么会这样?创建新行的代码如下所示
行创建代码
$scope.addRow = function(row) {
var guid = new Date().getMilliseconds();
var rowDate = row.date;
var rowToAdd = {
id: guid,
date: new Date(rowDate.getFullYear(), rowDate.getMonth(), rowDate.getUTCDay())
};
$scope.rows.splice(row.id, 0, rowToAdd);
};
任何帮助非常感谢?
谢谢,
Ps 如果您反向单击“添加”按钮,即单击第三个、第二个然后是第一个“添加”按钮,它会按预期工作 - 不明白为什么会有所不同 - 我猜这是光标问题但不知道为什么..
p.p.s guid 是为了解决在 ng-repeat 中有重复键限制的角度问题
【问题讨论】:
-
首先:您的日期格式会引发错误 (
Error: [ngModel:nonassign] http://errors.angularjs.org/1.4.8/ngModel/nonassign?p0=r.date%20%7CNaNate%3A%20'EEEE'&p1=%3Cinput%20type%3D%22text%22%20ng-model%3D%22r.date%20%7C%date%3A%20'EEEE'%22%20style%3D%22width%3A%20100px%22%20class%3D%22ng-pristine%20ng-untouched%20ng-valid%22%3E)。其次,您可以使用track by $index代替 guid:plnkr.co/edit/xq90WZNNlQJ5GFJRXEJb?p=preview -
您不需要添加随机的
id值来处理重复键,这就是ng-repeat上的track by $index的用途。另外,由于row.id是一个完全随机的值,你不能用它作为索引来定位splice中的插入点。 -
对于列表中您的
3项目,如果您的项目有3行(1, 2, 3)并且您点击3,您的新行将插入3后面,导致1, 2, 3, random)。然而,如果你点击1,你会得到(1, random, 2, 3)。现在,单击3,您希望它是最后一项,但它确实是“第四”项,给您(1, random, 2, random, 3)。您只有在首先添加1和2时才会注意到它,因为您在屏幕上打印的值(在这种情况下,您会得到 (1, random, random, random, 2, 3))。尝试在屏幕上打印row.id以查看真实订单。
标签: javascript angularjs