2016-04-09 3 views
1

Ich versuche Werte auf ein Element Attribut zu binden, die nicht-nativ ist und natürlich die übliche Vorgehensweise funktioniert nicht:Wie binde ich in Angular 2 an eine nicht-native Eigenschaft?

import {Directive, ElementRef, Input, OnInit, HostBinding} from 'angular2/core'; 

@Directive({ 
    selector: '[myFeet]' 
}) 
export class MyFeetDirective { 

    @HostBinding('feet') 
    @Input() feetProps:string 

    constructor(private el: ElementRef) { } 
} 

Ich Referenzierung diese Anweisung wie folgt aus:

<div [myFeet]="body.footCount"></div> 

Und ich möchte dies das Endergebnis in dem DOM (dh post-Angular-Rendering) sein:

<div feet="2"></div> 

ich dies eine ngOnInit f, indem einfach zu erreichen ist es gelungen, die

ngOnInit(){ 
    this._setAttributes(); 
} 

private _setAttributes(){ 
    if (this._feetProps != null) { 
     this._el.nativeElement.setAttribute("feet", this._feetProps); 
    } 
} 

Aber das ist nicht der Winkel Weg und ich fragte mich, was ist?

p.s. Ich denke, dass die Leistungsvorteile von Angular 2 in gewisser Weise mit der Einhaltung des nativen DOM zusammenhängen, aber gibt es eine Möglichkeit, dies für benutzerdefinierte Elemente/Attribute zu überschreiben? Vielleicht ist das falsch, so oder so, ich würde Ihre Einsicht schätzen.

+0

Eigentlich bin ich nicht sicher, ob Meine Antwort ist, wonach Sie suchen. Es fällt mir schwer, aus Ihrer Frage herauszufinden, was Ihr Problem ist und wie das Ergebnis der Lösung aussehen sollte. Was meinst du mit "offensichtlich funktioniert der übliche Ansatz nicht:"? Wenn du '

' im DOM willst, dann schreibe einfach '
' –

+0

Danke, Gunter, Es scheint sicherlich die richtige Idee zu sein, aber ich kämpfe immer noch darum, es zum Laufen zu bringen. Wenn ich die 'Attr.' Präfix, dann erscheint die Ausgabe nicht. Ich fummle immer noch damit herum, aber NG2 ist sehr neu für mich. Ich werde dies mit allem, was ich finde, aktualisieren. – Astravagrant

Antwort

2

Wenn das Attribut der DOM-Bindungsattribut-Bindungssyntax anstelle der Eigenschaftsbindungssyntax hinzugefügt werden soll.

@Directive({ 
    selector: '[myFeet]' 
}) 
export class MyFeetDirective { 

    @HostBinding('attr.feet') 
    @Input() feetProps:string 
} 
+0

Ich habe das Gefühl, dass Ihre Antwort die perfekte Lösung für Klarheit wäre, wenn NG2 diese Syntax mit den eckigen Klammern unterstützt (zB @HostBinding ('[attr.feet]')). Es wirft jedoch einen ungültigen Zeichenfehler auf – Astravagrant

+0

'[]' sind implizit in '@ HostBinding'. Verwenden Sie' @HostBinding ('attr.feet') ' –

+1

Das ist das erste, was ich ausprobiert habe, aber ich habe keine Ausgabe Ich überprüfe es noch einmal und da ich meine Direktive gelöscht habe (neu aufgebaut mit dem einfachen Beispiel oben), funktioniert es. Ich muss etwas im Konflikt gehabt haben. Dargh! Entschuldigung, diese Antwort ist richtig :) – Astravagrant

1

Ich würde den Wert der Direktive Eingabe verwenden Sie das Attribut mit dem host Block der Richtlinie festgelegt:

@Directive({ 
    selector: '[myFeet]', 
    host: { 
    '[attr.feet]': 'myFeetValue' 
    } 
}) 
export class MyFeetDirective { 
    @Input('myFeet') 
    myFeetValue:string 
} 

dieses plunkr Siehe: https://plnkr.co/edit/KYSIzmAqWLrc2n0yR8j5?p=preview

+0

Ja! Danke! Ich hatte diese Syntax in einigen Beispielen gesehen, aber sie schienen die "alte" und nicht die in den eckigen Dokumenten zu sein. https://angular.io/docs/ts/latest/guide/attribute-directives.html. Könnten Sie mir bitte auf die Referenz für diese Info zeigen? Ich würde gerne das aktuellste verwenden (verstehe, dass es ein WIP ist). Danke nochmal, sehr geschätzt :) – Astravagrant

Verwandte Themen