2015-12-21 4 views
17

Ich entwickle eine Angular2-Anwendung. Ich muss alle Links besonderes Verhalten hinzufügen, damit in Winkel 1.xi würde nur eine Richtlinie wie folgt schreiben:Global eine Anweisung in angular2 registrieren

angular.module('whatever.module', []).directive('href', function() { 
    return { 
     restrict: 'A', 
     link: function($scope, $element, $attrs) { 
      // do stuff 
     } 
    }; 
}); 

In angular2 i der Richtlinie wie folgt schreiben kann:

@Directive({ 
    selector: '[href]', 
}) 

export class MyHrefDirective { 
    constructor() { 
     // whatever 
    } 
} 

Aber wie auf Erde kann ich der Anwendung mitteilen, diese Richtlinie global zu verwenden? Ich habe eine Menge Ansichten mit Links zu ihnen. Muss ich es importieren und im Array directives in jeder dieser Komponenten angeben (was A LOT ist)?

ich es in die bootstrap Funktion versucht, die Injektion, wie Sie mit Dienstleistungen zu tun, sind angeblich global eine Instanz haben, aber , die nicht

+0

Ich denke, wenn Sie Ihre Richtlinie globaly ich meine zur Zeit der Bootstraping-Root-Komponente dann keine Notwendigkeit, in das Array jeder Komponente importieren –

+0

Wenn Sie den letzten Satz in meiner Frage gelesen haben, hätten Sie das gewusst das habe ich schon probiert. – kamilkp

Antwort

30

Mein Verständnis funktionierten ist, dass Sie für alle Gewohnheit entscheiden in haben Anweisungen auf Komponentenebene. Nur PLATFORM_DIRECTIVES sind implizit enthalten (ngFor, ngIf usw.).

Allerdings können Sie Ihre eigene benutzerdefinierte Richtlinie als PLATFORM_DIRECTIVE registrieren

import { provide, PLATFORM_DIRECTIVES } from '@angular/core'; 

bootstrap(RootCmp, [ 
    provide(PLATFORM_DIRECTIVES, {useValue: YourCustomDirective, multi: true}), 
]); 

Hier ist ein Artikel, der mehr über den Prozess spricht: http://blog.thoughtram.io/angular2/2015/11/23/multi-providers-in-angular-2.html

EDIT: Ich halte diese weniger problematisch jetzt da Komponenten auf Modulebene deklariert sind. Das bedeutet viel weniger Wiederholungen, da Sie keine Kindkomponenten mehr auf Komponentenebene deklarieren müssen.

+1

Danke. Das ist eine ausgezeichnete Unterwäsche, das war mir nicht bewusst. Klappt wunderbar. – kamilkp

+1

Hinweis: Das ' _PROVIDERS' wie' HTTP_PROVIDERS' kann direkt an die Liste übergeben werden, während alle Direktiven mit 'provide (..)' übergeben werden müssen, wie oben von TGH erklärt. Es muss keine benutzerdefinierte Direktive sein, aber auch externe npm-Bibliothek-basierte Direktiven, wie Anweisungen aus der material2-Bibliothek, müssen auf diese Weise in die Bootstrap-Funktion übergeben werden. –

+1

Vielleicht möchten Sie diese Antwort aktualisieren, da es nicht mehr relevant ist –