列表中的欺骗问题

时间:2015-02-28 09:33:21

标签: angularjs angularjs-ng-repeat

我在使用Angular设置列表时遇到了这个奇怪的问题。

Error: [ngRepeat:dupes] 

我要做的是从$ http获取带有$ http的api数据,并在解析它之后设置源:

var jdata = JSON.parse(data);
$scope.Items = jdata;
console.log(jdata);

以上代码产生上述错误。我试图添加track by $index,但这会使列表出错并且我得到的XX元素没有任何意义(只有三个)。

如果我从控制台输出中获取数据并将Items设置为等于,那么它可以正常工作!

$scope.Items = [{ "Id": 1, "OrganizationId": 1,... }];

那么问题是什么呢?只有当我从服务器(ASP.NET Web API)获取数据时才会出现问题。如果我从控制台输出粘贴输出的数据并使用它...它工作得很好!

我的标记:

           <div ng-repeat="item in Items">
                <p>{{item.Content}}</p>
                <p>{{item.State}}</p>
                <button ng-click="UnCompleteItem(item.Id)">UnComplete</button>
                <button ng-click="CompleteItem(item.Id)">Complete</button>
            </div>

我的数据(console.log(jdata)),3项:

[{"Id":1,"OrganizationId":1,"Content":"Item1","State":1,"CreatedBy":1,"CreatedDate":"2015-02-28T10:25:24.208783+01:00","ModifyBy":0,"ModifyDate":"0001-01-01T00:00:00","CompletedBy":0,"CompletedDate":"0001-01-01T00:00:00"},{"Id":2,"OrganizationId":1,"Content":"Item2","State":1,"CreatedBy":1,"CreatedDate":"2015-02-28T10:25:24.208783+01:00","ModifyBy":0,"ModifyDate":"0001-01-01T00:00:00","CompletedBy":0,"CompletedDate":"0001-01-01T00:00:00"},{"Id":3,"OrganizationId":1,"Content":"Item3","State":1,"CreatedBy":1,"CreatedDate":"2015-02-28T10:25:24.208783+01:00","ModifyBy":0,"ModifyDate":"0001-01-01T00:00:00","CompletedBy":0,"CompletedDate":"0001-01-01T00:00:00"}]

Fiddle to play with

解决方案(????):

感谢camden_kid我“想通了”它。我不知道为什么但是从服务器2解析字符串(!!!)次来解决问题。第一次使用JSON.parse然后使用angular.fromJson:

            var jdata = JSON.parse(data);
            var jdata2 = angular.fromJson(jdata) // could also use JSON.parse again

            $scope.Items = jdata2;

虽然console.log(jdata)看起来像上面列出的数组,但输出jdata看起来像这样:

Chrome控制台输出中的

[Object, Object, Object],现在可以使用!!

我现在可以使用$ http中的数据设置$ scope.Items,我也不需要track by部分! 我对这个解决方案不满意,看起来很讨厌所以如果有人知道为什么我必须这样做,如果你能告诉我,我会很高兴:D

1 个答案:

答案 0 :(得分:3)

JSON解析数据似乎存在问题。它返回一个字符串而不是一个对象。临时解决方案是再次解析:

var jdata = JSON.parse(jdata);