So beobachten Sie das DOM für Änderungen AngularJS

7

Das mag wie eine dumme Frage erscheinen, aber ich muss wissen, wie man das gesamte DOM einer Seite beobachtet und es jedes Mal neu kompiliert, wenn es sich ändert. Im Wesentlichen ist dies, was AngularJS standardmäßig durch die Verwendung von Datenbindungen tut, aber ich muss dies immer dann tun, wenn etwas im DOM geändert wird, nicht nur Bindungen. Der Grund dafür ist, dass ich eine App habe, die komplett in HTML, Javascript und PHP erstellt wurde. Es ist eine einzelne Seite Anwendung, es hat eine Hauptseite und injiziert PHP in einen DIV-Wrapper innerhalb dieser Seite.

Ich möchte einige Änderungen vornehmen, möchte aber meinen Code vollständig vom ursprünglichen Code trennen. Um dies zu tun, muss ich das DOM jederzeit neu kompilieren können, wenn eine neue PHP-Datei mit einer eigenen DOM-Struktur eingefügt wird. Was ich bisher gesehen habe, scheint nicht zu funktionieren.

%Vor%

Ich füge das Attribut watch dem <body> -Tag hinzu, aber es scheint nicht zu funktionieren, wenn das dom geändert wird, wird nichts geloggt. Letztendlich möchte ich das console.log durch $ compile ersetzen, aber zuerst muss ich die Uhr zum Laufen bringen. Kann mir jemand auf das hinweisen, was ich falsch mache?

    
richbai90 10.10.2013, 19:27
quelle

4 Antworten

31

Es ist eine schlechte Idee, aber ich werde dich verspotten.

Wie ich in meinen Kommentaren oben gesagt habe, ist es eine schlechte Idee, das zu tun, was Sie tun wollen. Das heißt, wenn du diesen Weg noch gehen willst, kannst du $watch einfach über alles machen, indem du eine Funktion als ersten Parameter übergibst.

Der folgende Code prüft, ob sich der HTML-Code im <body> -Tag geändert hat. Bitte beachten Sie, dass das eine Horror-Idee ist.

%Vor%

Die obige Uhr wird jederzeit ALLES in den HTML-Änderungen ausgelöst.

  • wenn sich ein Wert in einer Eingabe ändert
  • wenn sich die Auswahl in einem Dropdown-Menü ändert
  • wenn sich ein Attribut in einem Element in html ändert.
  • usw.

Zusätzliche Informationen: Im Moment gibt es in einer ganzen Reihe von Browsern keine wirklich gute Möglichkeit, nach neuen geladenen DOM-Elementen zu suchen. Der beste Weg ist immer noch, etwas auszulösen, sobald neue DOM-Elemente hinzugefügt wurden.

    
Ben Lesh 10.10.2013, 19:40
quelle
7

Wie von Steinway Wu erwähnt, ist MutationObserver der richtige Weg. Hier ist ein Ausschnitt:

%Vor%     
aaaaahaaaaa 10.08.2015 19:46
quelle
0

Wie bereits erwähnt hier (Mutation Events) können Sie Listener hinzufügen DOM-Mutationsereignisse wie DOMSubtreeModified .

z.B. element.addEventListener("DOMSubtreeModified", function (ev) {...}, false)

Aktualisieren

Und tatsächlich empfehlen sie stattdessen, stattdessen Mutation Observer zu verwenden.

    
Steinway Wu 19.06.2014 17:09
quelle
0

Ich weiß, dass dies ein altes Thema ist, aber ich habe ein ähnliches Problem beim Versuch, Änderungen im Inhalt eines Elements, das mit HTML-Code gefüllt ist, dynamisch aus dem Modell mit ng-bind-html zu entdecken Was ist mit der Zuordnung einiger benutzerdefinierter Daten zu den untergeordneten Elementen Ihres Elements ng-bind-html mit jqLites data() ? um zu erkennen, ob der Inhalt ersetzt wurde (und daher die benutzerdefinierten Daten verloren gingen)?

Dies wäre der Code eines directive , um die Änderungen eines Elements zu beobachten, das mit ng-bind-html gefüllt ist:

%Vor%

Ich hoffe, es hilft.
Kommentare sind willkommen.
Rafa

    
rbarriuso 02.09.2014 12:51
quelle

Tags und Links