【问题标题】:creating table rows dynamically with AngularJs使用 AngularJs 动态创建表行
【发布时间】:2016-04-08 01:01:24
【问题描述】:

我有以下使用 Angular js 的应用程序,我正在使用它来学习它。我有一个行表,我想动态地将新行添加到表中。当我单击添加按钮时,会创建一个新行,由于某种原因,有时位置不正确。也许该行的内部计数器被搞砸了,但我看不出这是如何发生的,或者为什么会发生......?

重建步骤:

  1. 单击第一个“添加”按钮 - 请注意它正下方的新行。
  2. 单击第二个“添加”按钮 - 请注意它正下方的新行。
  3. 单击第三个“添加”按钮 - 注意位置与预期不符(?)

我这里有一个 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


【解决方案1】:

我认为您使用的 splice() 函数有误。如果我了解您的问题(我不确定是否了解),您需要找到当前行的位置,即被点击的行,并根据该位置插入新行。

这是我的看法:https://plnkr.co/edit/xq90WZNNlQJ5GFJRXEJb?p=preview - 它仍然存在点击稍后一天会插入重复日期的问题,例如。单击“星期四”将插入另一个“星期三”。但是定位很扎实。

var index = $scope.rows.indexOf(row);

$scope.rows.splice(index, 0, rowToAdd);  

【讨论】:

  • 看着它就可以了。我点击的任何“添加”按钮都会在当前行下方立即呈现一个新行 - 这就是我想要的
【解决方案2】:

尝试使用 $index 来定义插入点:

在 html:

<button class="btn btn-success" ng-click="addRow(r, $index)">add</button>

在 js:

$scope.addRow = function(row, idx) {
    ...
    $scope.rows.splice(idx, 0, rowToAdd);  

见小偷:plunker

【讨论】:

  • 虽然这个可能有效,但使用$index 也容易出错,因为$index 不代表项目的数组索引,而是位置ng-repeat 中的项目,这意味着过滤和排序可能会导致 $index 的值与预期不同。
  • 如果有filter,insert的位置无所谓,参数idx可以一直为0。但最初的问题是错误的插入点。但是,是的,你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2019-03-13
  • 2017-03-24
  • 1970-01-01
  • 2014-08-14
  • 2016-11-30
相关资源
最近更新 更多