AngularJS: Acceso al ámbito de la directiva particular desde el controlador

Soy nuevo en angular, así que perdóname si me perdí algo o malentendí la documentación.

Tengo una directiva que convierte el elemento en un complemento de jQuery

.directive('myDir', function($compile) { return { link: function(scope, element, attributes) { // $('.someDiv').jqueryPlugin(...); element.jqueryPlugin(); var el = $compile("{{ 'label' }}")(scope); element.find('.label').html(el); } } }) 

Como puede ver, primero creo un plugin jquery en el elemento html (crea su elemento dom interior, incluyendo algunos div con clase de etiqueta; digamos que contiene una cadena que debería ser dinámica y debería ser traducible globalmente) y luego reemplacé Etiqueta generada por jquery estática a una interpolada. Debería poder manejarlo desde el controlador.

el problema es que puedo tener muchas directivas en un controlador, digamos

 

después de ejecutar la directiva y jQuery daría algo como, digamos,

 
{{label|translate}}
{{label|translate}}
{{label|translate}}
{{label|translate}}

¿Cómo, desde el controlador, puedo gestionar una directiva en particular? ¿Cómo acceder al ámbito de una elegida?

yo asumo eso

 // controller $scope.label = "some content"; 

va a cambiar todas las tags

¿Hay alguna manera de lograr el objective? ¿O debería revisar el enfoque del problema?

¡gracias por adelantado!

EDITAR

También tendré elementos dom, que necesitarían tener una directiva adjunta desde el nivel del controlador. También deben ser mantenibles desde este nivel. así que mi idea es proporcionar un servicio, que sería algún tipo de fachada con api, que funcionaría en elementos de dom jQuery-plugin’ed.

así que digamos que necesitaría algo

 .provider('facade', function() { this.$get = function($rootScope, $compile) { return { createPlugin: function(domElement, defaultLabel) { domElement.attr('my-dir', defaultLabel); $compile(domElement)($rootScope); }, changeLabel(domElement, newLabel) { // get a scope of myDir for provided dom element scope.label = newLabel; } } }; }) 

funciona para createPlugin, pero no tengo idea de cómo hacer que funcione changeLabel …

El mejor uso de la fachada sería desde el controlador:

 toBePlugined = $('div.tbp'); facade.createPlugin(toBePlugined, 'label'); facade.changeLabel(toBePlugined, 'label2'); 

¿Por qué necesito un servicio para eso? porque quiero poder modificar la configuración de elementos complementados desde varios lugares en el script. que podría incluir varios divs, etiqueta de cuerpo, etc.

y ahora, mi problema es acceder al ámbito de la directiva al proporcionar su referencia de objeto dom. ¿Es posible? Estaba intentando jugar con el atributo my-dir en el objeto dom sin ningún efecto.

Podría haber varias maneras de resolver esto, aquí hay un par de formas. Puede usar una directiva de ámbito aislado ( scope:{} ) con 2 vías ( = ), según cómo lo necesite. También puede usar scope:true , es decir, crear un ámbito secundario a partir de la directiva (si se usa con ng-repeat, incluso puede usarlo sin ámbito ya que ya crea un ámbito secundario). Pero este enfoque sería menos reutilizable / flexible en comparación con la directiva con su propio contrato (ámbito aislado).

Así que puedes cambiar tu directiva a:

 .directive('myDir', function($compile) { return { scope:{ label:'=myDir' //Set up 2 way binding }, link: function(scope, element, attributes) { // $('.someDiv').jqueryPlugin(...); element.jqueryPlugin(); var el = $compile("{{ 'label' }}")(scope); element.find('.label').html(el); } } }); 

y enlace desde su controlador, digamos que tiene una lista de tags.

  $scope.labels = [{label:'label1'}, {label:'label2'}, {label:'label3'}] 

entonces podrías simplemente hacer