2014-05-06 7 views
8

Die Angular-spezifische Eigenschaft auf aufgezählten Objekte $$hashKey kann für viele Dinge verwendet werden.

Zum Beispiel DOM-Targeting;

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

In einigen seltsamen Fall, dass ich jetzt erlebt habe die $$ HashKey prop noch nicht auf einem Objekt, das ich darauf zugreifen zu wollen, auf, obwohl es mit kantigem wiederholt wird. Gibt es eine Möglichkeit, diese Eigenschaft beim Initialisieren des Objekts selbst festzulegen?

Edit: Meine Vermutung ist, dass es eine Art von Ausführungsreihenfolge Problem gibt, dass ich auf die Eigenschaft zugreifen, wenn Angular die Wiederholung noch verarbeiten muss. Ich beobachte ein Objekt, in dem sich ein Array mit Objekten befindet, das wiederholt wird. Es ist auch auf einem dieser Objekte, die ich auf die $$hashKey Eigenschaft zugreifen muss.

Einfaches Beispiel;

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

erstellen Sie eine Plunker oder jsFiddle, es ist schwierig, das Problem, das Sie erleben – SoluableNonagon

+0

Meine Frage zu replizieren ist ziemlich einfach. Die Replikation des Problems wird auch für mich Zeit brauchen, da ich viele unternehmensspezifische Codes entfernen muss, die ich nicht öffentlich anzeigen kann. – Rasmus

+0

Ich stimme zu, dass es einfach ist, ich fordere Sie nicht auf, Buchungskreis zu buchen, nur um das Problem mit Dummy-Code zu replizieren. – SoluableNonagon

Antwort

5

Verwenden $ Timeout ohne Verzögerungswert zu verzögern, bis die $$ HashKey Eigenschaft ist:

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

A working fork of your Fiddle

+0

Dies scheint als ein Charme zu arbeiten! Ich bin nicht mehr bei der Arbeit, also kann ich nicht bestätigen, dass es tatsächlich funktioniert, aber ich sehe keinen Grund dafür. Ich werde ein Problem dafür in Angulars Issue-Tracker jedoch erstellen. Ich weiß nicht, ob das wie beabsichtigt funktioniert oder ob es ein Fehler ist und ich weiß nicht, wie tief es in letzterem Fall verwurzelt ist. – Rasmus

+1

Vielleicht lohnt sich die Erkundung. Ich denke jedoch, dass Sie das erwartete Verhalten finden werden, da Sie Angular eine Chance geben müssen, Ihr Objekt mit Dingen wie $$ HashKey zu dekorieren, bevor Sie darauf zugreifen. Wenn Sie etwas anderes herausfinden, wäre es hier ein Update wert. –

-1

ich ein Dummy-Beispiel erstellt von Code basierend auf, siehe hier: 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> 

Hoffentlich wirft ein Licht auf der $$ Hashkey

+0

Ich bekomme keine Fälle, in denen $$ Hashkey nicht gesetzt ist – SoluableNonagon

+0

Scheint, dass das Problem mehr mit seiner $ watch und etwas spezifisch für getHashKey() zu tun hat, was in seinem Beispielcode nicht ausreichend zum Ausdruck kommt und daher schwierig ist Hilfe mit. –

+0

Die 'getHashKey'-Funktion in meinem Beispiel ist nur ein Dummy. Tu einfach so, als ob es die Eigenschaft '$$ hashKey' liest. Ihr Code repliziert nicht mein Szenario ein Bit, es ist auch keine Antwort oder eine Lösung für meine eigentliche Frage. Ich weiß wirklich nicht, wie man das Szenario mehr vereinfacht. Es ist so einfach wie es geht. – Rasmus

Verwandte Themen