2015-05-16 26 views
6

Tôi đã thấy vài câu hỏi trong SO thảo luận về không có bản sao được phép trong ng-lặp lại. Câu hỏi của tôi có chút khác biệt. Trong trường hợp của tôi Tôi đang bối rối vì tôi không nhận được lỗi ngay cả khi có đối tượng trùng lặp trong mảngAngularJS Ng lặp lại và trùng lặp

Đây là HTML của tôi đang

<table> 
     <tr ng-repeat="item in items"> 
     <td> {{ item.email}}</td>   
     </tr> 
</table> 

Và đây là mã cho Populating mảng

app.controller('MainCtrl', function($scope) { 


$scope.items=[]; 

    $scope.items.push({ 
      "id":"1", 
      "email":"[email protected]"}); 
    $scope.items.push({ 
      "id":"1", 
      "email":"[email protected]"}); 

    $scope.items.push({ 
      "id":"2", 
      "email":"[email protected]"}); 
    $scope.items.push({ 
      "id":"2", 
      "email":"[email protected]"}); 


}); 

Theo sự hiểu biết của tôi, tôi sẽ nhận được các lỗi và có những đối tượng trùng lặp trong mảng

Tuy nhiên, kết quả của nó được hiển thị hoàn hảo. Dưới đây là liên kết plunker

ng-repeat-demo

Rõ ràng là tôi đang thiếu cái gì cơ bản. Ai đó có thể chỉ ra khoảng cách của tôi trong sự hiểu biết?

EDIT

Đây là những gì trong ứng dụng của tôi, tôi đã phải đối mặt với (chỉ id email được thay đổi vì lý do rõ ràng)

ExampleApp.filter ("extractEmail", function() {

return function(items){ 
    //console.log("test" + input[0].highlight.file[0]); 
    var filtered = []; 

    console.log(" items == " + items); 


    angular.forEach(items, function(item){ 

     if (item){ 
     var obj = item.highlight.file[0].toString().match(/([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})/); 

     if (obj) { 
     //console.log(obj[0]); 
     filtered.push(obj[0]); 
     } 

     } 


    }); 

    console.log(filtered); 
    return filtered; 
    } 

}); 

bản in console.log của tôi [“[email protected]", “[email protected]", “[email protected]", “[email protected]"]

lỗi tôi nhận được

Error: [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: x in clusterState| extractEmail, Duplicate key: string:[email protected], Duplicate value: “[email protected]" 

Tôi đã cập nhật plunker bằng mã tương tự. Không thể tái tạo

Second Sửa

Vấn đề là với phiên bản tôi đang sử dụng: Angular JS 1.0.x hỗ trợ bản sao không thể tái tạo http://plnkr.co/edit/qrOez7aZ7X1jsOrmkfiP?p=preview

Với sự phiên bản sau có thể sao chép

http://plnkr.co/edit/q3oPCrW3RepxvWSZ1LB1?p=preview

+4

Đây là một trong số ít những lần ai đó phàn nàn về việc không nhận được một lỗi. – Huey

+1

cố gắng hiểu :) –

+2

Điều này chắc chắn là một điều tốt để cố gắng hiểu. Góc là quan tâm về * bình đẳng *, không * tương đương *. '{id: 1}' có thể trông giống như '{id: 1}', nhưng '' {id: 1} === {id: 1} 'sẽ trả về' false', bởi vì nó tạo ra một đối tượng mới cho mỗi cái. Điều này là do các đối tượng và mảng, được theo dõi bằng tham chiếu, chứ không phải theo giá trị. Bây giờ, nếu bạn đã làm 'var objX = {" id ":" 1 "," email ":" [email protected] "}', và sau đó '$ scope.items.push (objX); $ scope.items.push (objX); 'bạn sẽ nhận được lỗi (vì' objX === objX' là 'true') – DRobinson

Trả lời

5

Đối tượng trong javascript được so sánh theo tham chiếu chứ không phải theo giá trị. Nó thực sự không quan trọng nếu nội dung của một đối tượng là chính xác giống như một trong những khác, nếu các tài liệu tham khảo không trỏ đến cùng một đối tượng, họ là khác nhau.
ví dụ .:

// In this case "var a" and "var b" points to different objects. 
var a = {}; 
var b = {}; 

a == b; // false 

// Here, they points to the same one 
var a = {}; 
var b = a; 

a == b; // true 

Nếu bạn cần mỗi entry là riêng biệt mà bạn phải kiểm tra tất cả các mục mình.
Ngắt lặp lại góc có biến thể cú pháp sử dụng track by để cho phép bạn quyết định mục nhập nào khác biệt (hoặc được nhân bản).

<div ng-repeat="entry for entries track by entry.id">{{entry.email}}</div> 
+0

Và đó chính xác là những gì" theo dõi "là trong Angular: https: // docs .angularjs.org/api/ng/directive/ngRepeat. – SkyWriter

+0

@SkyWriter, bạn hoàn toàn đúng! 'track by' là cách để đi (chỉnh sửa câu trả lời của tôi) – NemoStein

+0

https://docs.angularjs.org/api/ng/directive/ngRepeat" Theo mặc định, ngRepeat không cho phép các mục trùng lặp trong mảng. Điều này là do khi có là bản sao, không thể duy trì ánh xạ một-một giữa các mục bộ sưu tập và các phần tử DOM. " Nó không nói bất cứ điều gì về tài liệu tham khảo. Bạn không nghĩ rằng trong trường hợp tài liệu nên rõ ràng hơn –

5

Các mục không được coi là bình đẳng vì chúng trỏ đến các tham chiếu khác nhau.

Nếu bạn theo dõi ID, bạn sẽ gặp lỗi vì các ID bằng nhau.

<tr ng-repeat="item in items track by item.id"> 
    <td> {{ item.email}}</td>   
</tr> 

Xem fiddle này: http://jsfiddle.net/aj_r/7d4n9z0u/

Các vấn đề liên quan