2014-05-06 6 views
8

La proprietà Angular-specific sugli oggetti numerati $$hashKey può essere utilizzata per un sacco di cose.

Ad esempio Targeting DOM;

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

In alcuni casi strano che sto vivendo ora il $$ prop HashKey non è ancora impostato su un oggetto voglio accedere su anche se si ripete con angolare. C'è un modo per impostare questa proprietà da sé quando si inizializza l'oggetto?

Modifica: La mia ipotesi è che ci sia qualche forma di problema di ordine di esecuzione, che accedo alla proprietà quando Angular deve ancora elaborare la ripetizione. Sto osservando in profondità un oggetto, all'interno di quell'oggetto c'è una matrice con oggetti che si ripetono. È anche su uno di quegli oggetti che ho bisogno di accedere alla proprietà $$hashKey su.

Semplice esempio;

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

Si prega di creare un plunker o jsFiddle, è difficile replicare il problema riscontrato – SoluableNonagon

+0

La mia domanda è piuttosto semplice. Replicare il problema richiederà tempo anche per me, perché devo eliminare un sacco di codice specifico dell'azienda che non posso visualizzare pubblicamente. – Rasmus

+0

Sono d'accordo che è semplice, non ti sto chiedendo di pubblicare il codice della compagnia, solo per replicare il problema usando il codice fittizio. – SoluableNonagon

risposta

5

Usa $ timeout senza alcun valore di ritardo di differire fino alla proprietà $$ HashKey è disponibile:

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

A working fork of your Fiddle

+0

Questo sembra funzionare come un fascino! Non sono più al lavoro quindi non posso confermare che funzioni effettivamente, ma non vedo alcuna ragione per non farlo. Tuttavia creerò un problema per questo in Issue-tracker. Non so se questo funziona come previsto o se si tratta di un bug e non so quanto sia profondamente radicato in quest'ultimo caso. – Rasmus

+1

Potrebbe valere la pena esplorare. Penso però che troverai che è un comportamento previsto in quanto devi dare ad Angular la possibilità di decorare il tuo oggetto con cose come $$ hashKey prima di accedervi. Se lo scoprirai diversamente, sarebbe degno di un aggiornamento qui. –

-1

ho creato un esempio fittizio in base a voi il codice, vedi qui: 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> 

Speriamo che questo getta una luce su l'hashkey $$

+0

Non ricevo istanze in cui $$ hashkey non è impostato – SoluableNonagon

+0

Sembra che il problema abbia più a che fare con il suo $ watch e qualcosa di specifico su getHashKey(), che non è espresso a sufficienza nel suo codice di esempio ed è quindi difficile da aiutare con. –

+0

La funzione 'getHashKey' nel mio esempio è solo un manichino. Fai finta di leggere la proprietà '$$ hashKey'. Il tuo codice non replica il mio scenario un po ', non è nemmeno una risposta o una soluzione alla mia domanda reale. Davvero non so come semplificare di più lo scenario. È così semplice come si arriva. – Rasmus