Dies ist eigentlich eine Ausgliederung von here, mit einem viel einfacheren Anwendungsfall, obwohl. Es geht darum, Angular2 mitzuteilen, dass extern hinzugefügte DOM-Elemente mit Angular-Direktiven vorhanden sind. In diesem Fall füge ich eine neue Schaltfläche hinzu, deren On-Click-Ereignis niemals gebunden ist. Ich dachte, Zone würde automatisch Änderungen in den Vorlagen ihrer Komponenten erkennen, offensichtlich nicht. Ist jemand in der Lage, diesen Code ohne den immensen Overhead zu erstellen, eine neue Komponente für die Schaltfläche zu erstellen und über DynamicLoaderComponent
zu laden?Wie Angular2 RC1 über veränderte DOM wissen lassen
Hinweis: Ich habe bereits NgZone
und ChangeDetectorRef
hinzugefügt, um damit herumzuspielen. Beides funktionierte nicht für mich. Hier
ist ein Link zum vollständigen Beispiel bei plunkr: plnkr.co/edit/hf180P6nkxXtJDusPdLb
Und das ist ein relevanter Ausschnitt aus der Komponente:
import {Component, AfterViewInit, ChangeDetectorRef, NgZone, Renderer} from '@angular/core'
@Component({
selector: 'my-app',
providers: [],
template: `
<div>
<p><button on-click="clickMe()">This works</button></p>
<div id="insert-here"></div>
</div>
`,
directives: []
})
export class App implements AfterViewInit {
constructor(private ref:ChangeDetectorRef, private ngZone:NgZone, private renderer:Renderer) {
}
clickMe() {
alert("Yay, it works");
}
ngAfterViewInit() {
let newButton = document.createElement("button");
newButton.setAttribute("on-click","clickMe()");
let textNode = document.createTextNode("This does not");
newButton.appendChild(textNode);
document.getElementById("insert-here").appendChild(newButton);
// please make my button work:
this.ref.detectChanges();
}
}
macht Wenn alles, was Sie benötigen ein Ereignis hinzufügen, können Sie 'NewButton tun. addEventListener ('click', this.clickMe); 'ohne 'NgZone' oder' ChangeDetectorRef' zu benötigen – Abdulrahman
Danke, Abdulrahman Leider gibt es mehr als das. Ich habe Dutzende von großen SVGs mit bis zu 50 verschiedenen Klickereignissen in einem SVG. Ich brauche wirklich Angular, um den Job zu machen. Eigentlich ist es etwas, das seinem Kern innewohnt: Scannen von Markup und Binding-Logik zu Direktiven. – Matt