Vergessen Sie den Dienst, gibt es eine einfachere Form des Handelns dies
Option 1
(Nicht das, was man braucht, aber es kann für andere Benutzer nützlich sein) HTML
<my-component layout-item="my first component config"></my-component>
<my-second-component layout-item="my second component config"></my-second-component>
<my-third-component layout-item="my third component config"></my-third-component>
Drei verschiedene Komponenten, alle teilen sich die gleiche layout-item
Eigentum.
Richtlinie
@Directive({
selector : '[layout-item]',
properties: ['myParentConfig: my-parent-config'] // See the components for this property
})
export class MyDirective {
constructor() {
}
onInit() {
console.log(this.myParentConfig);
}
}
Ziemlich einfach, nicht viel zu erklären
Komponente
@Component({
selector : 'my-component',
properties : ['myConfig: layout-item']
})
@View({
template : `<div [my-parent-config]="myConfig" layout-item="my config"></div>`,
directives : [MyDirective]
})
export class MyComponent {
constructor() {
}
}
Ich bin mir ziemlich sicher, dass Sie das verstehen, aber aus Gründen von einer guten Antwort werde ich erklären, was es tut
properties : ['myConfig: layout-item']`
Diese Linie weist die layout-item
Eigenschaft auf die interne myConfig
Eigenschaft.
Komponente der Vorlage
template : `<div [my-parent-config]="myConfig" layout-item="my config"></div>`,
Wir sind eine my-parent-config
Eigenschaft für die Richtlinie zu schaffen und wir die Eltern config zuweisen.
So einfach ist das! So, jetzt können wir mehr Komponenten mit (ziemlich) dem gleichen Code
Zweite Komponente
@Component({
selector : 'my-second-component',
properties : ['myConfig: layout-item']
})
@View({
template : `<div [my-parent-config]="myConfig" layout-item="my config"></div>`,
directives : [MyDirective]
})
export class MySecondComponent {
constructor() {
}
}
Siehe unten? War viel einfacher als meine Idee von using services (schrecklich, aber "funktionierende" Idee).
Mit diesem Weg ist es viel einfacher und sauberer. Hier ist die plnkr, so dass Sie es testen können.
(Es war nicht das, was Sie brauchen: '()
UPDATE
Option 2
Für das, was ich von Ihrer aktualisierten Frage verstanden ist, dass Sie eine brauchen Verweis auf die Komponente, so was ich kam, ist ziemlich ähnlich zu meiner ursprünglichen Antwort
Was ich tat:
- Zuerst machte ich die Komponenten einen Verweis auf sich
<my-cmp-a #pa [ref]="pa" layout-item="my first component config"></my-cmp-a>
<my-cmp-b #pb [ref]="pb" layout-item="my first component config"></my-cmp-b>
<my-cmp-C#pc [ref]="pc" layout-item="my first component config"></my-cmp-c>
- Dann ging ich jeden Verweis auf die
LayoutItem
Richtlinie (die in jeder Komponente injiziert wurde, zu halten, nicht an der Spitze -Level)
@Component({
selector : 'my-cmp-a',
properties : ['ref: ref']
})
@View({
template : '<div [parent-reference]="ref" layout-item=""></div>',
directives : [LayoutItem]
})
@YourCustomAnnotation({})
export class MyCmpA {
constructor() {
}
}
- Schließlich in der Direktive können Sie Zugriff auf den Konstruktor der Komponente haben (von Ihrer aktualisierten Frage denke ich, das ist alles, was Sie brauchen, um seine Metadaten zu erhalten) (Sie müssen es in onInit verwenden, "Verweis" wird nicht im Konstruktor vorhanden sein)
@Directive({
selector : '[layout-item]',
properties : ['reference: parent-reference']
})
export class LayoutItem {
constructor() {
}
onInit() {
console.log(this.reference.constructor);
Reflector.getMetadata("YourCustomAnnotation", this.reference.constructor);
}
}
verwenden plnkr Ihre Tests zu tun.
Sie könnten einen Dienst verwenden, um von der Komponente der Richtlinie sein Eigentum zu übergeben. Denken Sie daran [dies] (https://github.com/angular/angular/pull/3372), obwohl ich nicht weiß, ob das nur @Ancestor umbenannt oder seine Funktionalität ändert. –
Hallo @ Eric Martinez. Nicht sicher, wie man es mit einem Service macht. Kannst du etwas näher ausführen? – jpsfs
Siehe meine Antwort, ich habe es ohne Dienste gemacht. –