Me gustaría hacer una modificación menor a una directiva de terceros (específicamente Angular UI Bootstrap ). Simplemente quiero agregar al alcance de la pane
directiva:
angular.module('ui.bootstrap.tabs', [])
.controller('TabsController', ['$scope', '$element', function($scope, $element) {
// various methods
}])
.directive('tabs', function() {
return {
// etc...
};
})
.directive('pane', ['$parse', function($parse) {
return {
require: '^tabs',
restrict: 'EA',
transclude: true,
scope:{
heading:'@',
disabled:'@' // <- ADDED SCOPE PROPERTY HERE
},
link: function(scope, element, attrs, tabsCtrl) {
// link function
},
templateUrl: 'template/tabs/pane.html',
replace: true
};
}]);
Pero también quiero mantener Angular-Bootstrap actualizado con Bower. Tan pronto como corra bower update
, sobrescribiré mis cambios.
Entonces, ¿cómo hago para extender esta directiva por separado de este componente de bower?
$provide.decorator()
, vea mi respuesta a continuación.Respuestas:
Probablemente, la forma más sencilla de resolver esto es crear una directiva en su aplicación con el mismo nombre que la directiva de terceros. Ambas directivas se ejecutarán y puede especificar su orden de ejecución utilizando la
priority
propiedad (la prioridad más alta se ejecuta primero).Las dos directivas compartirán el alcance y puede acceder y modificar el alcance de la directiva de terceros a través del
link
método de su directiva .Opción 2: También puede acceder al alcance de una directiva de terceros simplemente colocando su propia directiva nombrada arbitrariamente en el mismo elemento (asumiendo que ninguna directiva usa un alcance aislado). Todas las directivas de alcance no aisladas de un elemento compartirán el alcance.
Lectura adicional: https://github.com/angular/angular.js/wiki/Dev-Guide%3A-Understanding-Directives
Nota: Mi respuesta anterior fue para modificar un servicio de terceros, no una directiva.
fuente
$compile
documento aquíTL; DR - ¡dame la demostración!
Big Demo Button
Use
$provide
'sdecorator()
para, bueno, decorar la directiva del tercero.En nuestro caso, podemos extender el alcance de la directiva así:
Primero, solicitamos decorar la
pane
directiva pasando su nombre, concatenado conDirective
como primer argumento, luego lo recuperamos del parámetro de devolución de llamada (que es una matriz de directivas que coinciden con ese nombre).Una vez que lo tenemos, podemos obtener su objeto de alcance y extenderlo según sea necesario. Tenga en cuenta que todo esto debe hacerse en el
config
bloque.Algunas notas
Se ha sugerido simplemente agregar una directiva con el mismo nombre y luego establecer su nivel de prioridad. Además de ser poco semántico (que ni siquiera es una palabra , lo sé ...), plantea problemas, por ejemplo, ¿qué pasa si el nivel de prioridad de la directiva de terceros cambia?
JeetendraChauhan ha afirmado (aunque no lo he probado) que esta solución no funcionará en la versión 1.13.
fuente
decorator()
está roto (actualizado a docs.angularjs.org/api/auto/service/$provide#decorator )bindToController
se introdujo en la v1.3. Pero tenga en cuenta que esto no debe considerarse una solución alternativa, esto es solo para un caso específico en el que la directiva original se estableció con labindToController
propiedad. Buena idea, publicaré esto como respuesta :)Si bien esta no es la respuesta directa a su pregunta, es posible que desee saber que la última versión (en master) de http://angular-ui.github.io/bootstrap/ agregó soporte para deshabilitar pestañas. Esta función se agregó a través de: https://github.com/angular-ui/bootstrap/commit/2b78dd16abd7e09846fa484331b5c35ece6619a2
fuente
Otra solución en la que crea una nueva directiva que la extiende sin modificar la directiva original
La solución es similar a la solución del decorador:
Cree una nueva directiva e inyecte como dependencia la directiva que desea extender
De esta manera, puede usar la directiva original y la versión extendida en la misma aplicación
fuente
angular.merge
debería haberse utilizado, actualizaré el ejemploAquí hay otra solución para un escenario diferente de extender enlaces a una directiva que tiene la
bindToController
propiedad.Nota: esta no es una alternativa a otras soluciones que se ofrecen aquí. Resuelve solo un caso específico (no cubierto en otras respuestas) en el que se estableció la directiva original
bindToController
.fuente