2014-05-06 26 views
8

Thuộc tính góc cụ thể trên các đối tượng được liệt kê $$hashKey có thể được sử dụng cho nhiều thứ.

Ví dụ: nhắm mục tiêu theo DOM;

<div ng-repeat="obj in objects"> 
    <label for="field-{{obj.$$hashKey}}"> 
     Label 
    </label> 
    <input type="text" id="field-{{obj.$$hashKey}}" /> 
</div> 

Trong một số trường hợp lạ tôi đang gặp bây giờ $$ hashKey prop chưa được đặt trên đối tượng tôi muốn truy cập ngay cả khi nó được lặp lại với Angular. Có cách nào để tự đặt thuộc tính này khi khởi tạo đối tượng không?

Chỉnh sửa: Tôi đoán là có một số hình thức của vấn đề trật tự thực hiện, rằng tôi truy cập vào tài sản khi Angular vẫn chưa xử lý sự lặp lại. Tôi đang xem sâu một đối tượng, trong đối tượng đó là một mảng với các đối tượng được lặp lại. Đó cũng là một trong những đối tượng mà tôi cần truy cập vào thuộc tính $$hashKey.

Ví dụ đơn giản;

var MyController = function($scope, Obj) 
{ 
    $scope.obj = { 
     list: [obj, obj, obj, obj] 
    }; 

    $scope.$watch("obj", function() 
    { 
     var lastObj = $scope.obj.list[$scope.obj.list.length - 1]; 
     console.log(lastObj.$$hashKey); // Undefined? 
    }, true); 

    $scope.addObj = function() 
    { 
     $scope.obj.list.push(new Obj()); 
    }; 
}; 

Edit2: jsFiddle http://jsfiddle.net/2sbWp/2/

+0

Hãy tạo một plunker hoặc jsFiddle, thật khó để nhân rộng các vấn đề bạn đang gặp – SoluableNonagon

+0

Câu hỏi của tôi khá đơn giản. Tái tạo sự cố sẽ mất thời gian ngay cả đối với tôi vì tôi phải loại bỏ nhiều mã dành riêng cho công ty mà tôi không thể hiển thị công khai. – Rasmus

+0

Tôi đồng ý rằng nó đơn giản, tôi không yêu cầu bạn đăng mã công ty, chỉ để nhân rộng vấn đề bằng cách sử dụng mã giả. – SoluableNonagon

Trả lời

5

Sử dụng $ timeout không có giá trị chậm trễ để trì hoãn cho đến khi tài sản $$ hashKey có sẵn:

$timeout(function(){console.log(lastObj.$$hashKey)}); 

A working fork of your Fiddle

+0

Điều này dường như làm việc như một sự quyến rũ! Tôi không còn ở nơi làm việc vì vậy tôi không thể xác nhận nó thực sự hoạt động, nhưng tôi không thấy lý do gì cho việc đó. Tôi sẽ tạo ra một vấn đề cho điều này trong Angulars vấn đề theo dõi mặc dù. Tôi không biết nếu điều này là làm việc như dự định hoặc nếu nó là một lỗi và tôi không biết làm thế nào sâu rễ nó là trong trường hợp thứ hai. – Rasmus

+1

Có thể đáng khám phá. Tôi nghĩ rằng mặc dù bạn sẽ tìm thấy nó được mong đợi hành vi như bạn cần để cung cấp cho Angular một cơ hội để trang trí đối tượng của bạn với những thứ như $$ hashKey trước khi truy cập chúng. Nếu bạn tìm ra cách khác, nó sẽ là xứng đáng với một bản cập nhật ở đây. –

-1

Tôi tạo ra một ví dụ giả dựa trên bạn mã, xem tại đây: http://plnkr.co/edit/9PNc6bcy1TO4Zaeyuvwq?p=preview

var app = angular.module('gssApp', []); 

app.controller('gssAppController', [ '$scope', '$http', function ($scope, $http) 
{ 
    var obj = {'hash': 'test'}; 
    $scope.newObject = {'hash': 'test'}; 
    $scope.model = null; 

    $scope.objects = []; 

    $scope.addObj = function(){ 
    if($scope.model !== null && $scope.model !== undefined){ 
     $scope.objects.push({'hash': $scope.model}); 
     $scope.model = ''; 
     angular.forEach($scope.objects, function(key, value){ 
     console.log(value, key); 
     }); 
    } 
    }; 

}]); 

HTML

<body ng-app="gssApp" ng-controller="gssAppController"> 
    <div ng-repeat="obj in objects"> 
     <label for="field-{{obj.$$hashKey}}" ng-click="alert(obj.$$hashKey)"> 
     Label 
     </label> 
     <input type="text" id="field-{{obj.$$hashKey}}" /> 
    </div> 
    <input type="text" placeholder='add new key' ng-model="model"> 
    <button ng-click="addObj();">Submit</button> 
</body> 

Hy vọng này đã làm rõ được $$ hashkey

+0

Tôi không nhận được bất kỳ trường hợp nào mà $$ hashkey không được thiết lập – SoluableNonagon

+0

Dường như vấn đề có liên quan đến đồng hồ $ của anh ta và cái gì đó cụ thể cho getHashKey(), không được thể hiện đầy đủ trong mã mẫu của anh ấy giúp với. –

+0

Chức năng 'getHashKey' trong ví dụ của tôi chỉ là giả. Chỉ cần giả vờ nó đọc thuộc tính '$$ hashKey'. Mã của bạn không nhân bản kịch bản của tôi một chút, nó cũng không phải là câu trả lời hay giải pháp cho câu hỏi thực tế của tôi. Tôi thực sự không biết cách đơn giản hóa kịch bản nhiều hơn nữa. Nó đơn giản như nó được. – Rasmus

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