2014-04-10 13 views
10

Voglio aggiungere un ID univoco a ciascun div nella presente direttiva, in modo che possa specificare quale elemento che google maps dovrebbero passare:Come si può aggiungere un ID univoco a ciascuna istanza di una direttiva?

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

Eventuali duplicati di [ID univoci direttiva di modello per gli elementi] (http://stackoverflow.com/questions/21021951/directive-template-unique-ids-for-elements) –

risposta

23

È possibile utilizzare l'ID univoco dell'ambito della direttiva.

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

scope.$id ritorno un numero univoco monotonicamente aumentano per ogni istanza ambito.

Il campo "::" consente di utilizzare l'associazione una tantum se si utilizza la versione 1.3 o successiva.

Vedi Angular scope documentation

+0

È garantito che questi ID rimarranno unici anche quando gli elementi allegati a questi ID vengono distrutti o ricreati dinamicamente? Quello che intendo è, se in un dato momento '$ id = 26' e l'elemento che trasporta questo ID è distrutto,' id id = 26' sarà mai generato di nuovo anche se lo stesso elemento è ricreato? –

+0

In base alla [documentazione $ rootScope] (https://docs.angularjs.org/api/ng/type/$rootScope.Scope), l'ID $ aumenta monotonicamente. Quindi sì, il $ id sarà unico nel tempo finché non si distruggerà il $ rootScope. – Techniv

5

aggiungere un servizio che si occupa di restituire id uniche.

Esempio:

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

    var nextId = 1; 

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

E poi semplicemente iniettare questo servizio nella vostra direttiva e chiamare per ottenere un ID univoco:

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

Una soluzione semplice per non introdurre un po 'di codice aggiuntivo è utilizzare solo Date.now()

genererebbe per esempio: 1397123701418

+1

soluzione Neat! Hai appena salvato la mia giornata! Grazie –

Problemi correlati