0

我正在尝试创建一个像下面这样的表单,这个使用 ng-repeat 指令在角度中,每当我创建一个新行时它都会抱怨“不允许在转发器中重复。”。

在此处输入图像描述

虽然我知道解决方案是通过“按 $index 进行跟踪”,但它会导致另一个问题,即单击一行上的删除会删除其他字段的值。所以我怀疑按索引跟踪对于静态文本但不是输入表单是可以的。那么如何为我的情况正确使用 ng-repeat 呢?请参阅我的JSFiddle进行演示。

我当前的代码:

HTML

<div class="row-fluid spacer10">
    <a ng-click="addAKA()" class="btn btn-primary spacer5 left30"><i class="icon-plus icon-white"></i> Add New Alias</a>
</div>
<div class="row-fluid spacer10"></div>
<div class="row-fluid spacer5" ng-repeat="item in aliasList track by $index">
    <input type="text" class="span6 left30" ng-model="item">
    <button class="btn btn-danger" ng-click="deleteAKA($index)">delete</button>
    <BR/>
</div>

Javascript

$scope.addAKA = function ()
{
    if($scope.aliasList == null)
    {
        $scope.aliasList = [];
    }
    $scope.aliasList.push("");
    $scope.aliasjson = JSON.stringify($scope.aliasList);
}


$scope.deleteAKA = function (idx)
{
    var aka_to_delete = $scope.aliasList[idx];
    $scope.aliasList.splice(idx, 1);
    $scope.aliasjson = JSON.stringify($scope.aliasList);
}
4

2 回答 2

1

只需改变你迭代的方式。而不是这个:

<div ng-repeat="item in aliasList track by $index">

做这个:

<div ng-repeat="item in aliasList">

$index将在元素内部仍然可用,像这样使用:

<button ng-click='deleteItem($index)'>Delete</button>

请参阅此JSFiddle以获得正确的解决方案

于 2013-10-10T07:53:21.843 回答
0

您的方法存在多个问题。

由于您直接将字符串绑定到 ng-model 并且 ng-repeat 创建了一个子范围,因此对值的任何更改都不会反映回来。将您的范围模型更改为类似

$scope.list = [{text:"one"},{text:"two"}];

并绑定到i.text而不是i像之前那样绑定到。

使用 item 而不是索引调用 deleteItem 方法。在这里看我的小提琴

http://jsfiddle.net/JS6aJ/1/

于 2013-10-10T07:57:58.400 回答