2014-04-10 3 views
10

Ich mag eine eindeutige ID zu jedem div in dieser Richtlinie hinzuzufügen, so dass ich mit welchem ​​Elemente angeben kann, dass Google Maps passieren sollte:Wie können Sie jeder Instanz einer Anweisung eine eindeutige ID hinzufügen?

directive('gMap', function(googleMaps){ 
return{ 
     restrict: 'E', 
     replace: true, 
     transclude: true, 
     template: "<div id="{{unique_ID}}"></div><div ng-transclude></div>", 
     scope: true, 
     link: function(scope, element, attrs){ 


      //create the map 
      var center = googleMaps.makePosition(attrs.centerlat, attrs.centerlong) 
      //update map on load 
      var options = googleMaps.setMapOptions(center, attrs.zoom); 
      scope.map = googleMaps.createMap(options, unique_id)  
     }, 
    }; 
}). 
+1

Mögliches Duplikat [Richtlinie Vorlage eindeutiger IDs für Elemente] (http://stackoverflow.com/questions/21021951/directive-template-unique-ids-for-elements) –

Antwort

23

Sie können die eindeutige ID des Geltungsbereichs der Richtlinie verwenden.

<div id="gMap-{{::$id}}"></div><div ng-transclude></div> 

scope.$id Rückkehr eine eindeutige Nummer, die für jede Instanz Umfang monoton erhöhen.

Das '::' soll die einmalige Bindung verwenden, wenn Sie angular 1.3 oder höher verwenden.

Siehe Angular scope documentation

+0

Ist garantiert, dass diese IDs auch dann eindeutig bleiben, wenn die an diese IDs angehängten Elemente zerstört oder dynamisch neu erstellt werden? Was ich meine ist, wenn zu einer gegebenen Zeit $ id = 26 und das Element, das diese ID trägt, zerstört wird, wird $ id = 26 immer wieder erzeugt, selbst wenn das gleiche Element neu erstellt wird? –

+0

Gemäß der [$ rootScope-Dokumentation] (https://docs.angularjs.org/api/ng/type/$rootScope.Scope) nimmt $ id monoton zu. Also ja, die $ ID wird im Laufe der Zeit einzigartig sein, solange du das $ rootScope nicht zerstörst. – Techniv

5

einen Dienst hinzufügen, die eindeutige ID der verantwortlich ist zurückzukehren.

Beispiel:

angular.module("app").service("UniqueIdService", function(){ 

    var nextId = 1; 

    this.getUniqueId = function(){ 
     return nextId++; 
    } 
}); 

Und dann einfach diesen Service in Ihre Richtlinie injiziert und nennt es eine eindeutige ID zu erhalten:

directive('gMap', function(googleMaps, UniqueIdService){ 
return{ 
     restrict: 'E', 
     replace: true, 
     transclude: true, 
     template: "<div id="{{unique_ID}}"></div><div ng-transclude></div>", 
     scope: true, 
     link: function(scope, element, attrs){ 
      scope.unique_ID = UniqueIdService.getUniqueId(); 

      //create the map 
      var center = googleMaps.makePosition(attrs.centerlat, attrs.centerlong) 
      //update map on load 
      var options = googleMaps.setMapOptions(center, attrs.zoom); 
      scope.map = googleMaps.createMap(options, scope.unique_ID)  
     }, 
    }; 
}). 
16

Eine einfache Lösung nicht ein Bündel von zusätzlichem Code einzuführen, ist zu verwenden, nur Date.now()

zum Beispiel erzeugen würde: 1397123701418

+1

saubere Lösung! Du hast gerade meinen Tag gerettet! Danke –

Verwandte Themen