Wie sehen Sie den DOM für änderungen AngularJS
Dies mag wie eine dumme Frage, aber ich muss wissen, wie zu beobachten, die gesamte DOM einer Seite und kompilieren Sie es jedes mal verpasst. Das ist im wesentlichen, was AngularJS standardmäßig tut, die durch die Nutzung des databindings, aber ich muss das geschehen jederzeit alles im DOM wird geändert, nicht nur Bindungen. Der Grund warum ist, weil ich eine app, die ist komplett in HTML, Javascript und PHP. Es ist ein single-page-Anwendung, hat es eine Hauptseite und spritzt PHP in einen DIV-wrapper in die Seite.
Möchte ich einige änderungen vornehmen, um es, wollen aber die halten meinen code komplett getrennt von den original-code. Um dies zu tun muss ich in der Lage sein zu kompilieren, die DOM jederzeit eine neue PHP-Datei mit seinen eigenen DOM-Struktur injiziert wird. Was ich bisher nicht zu sein scheinen zu arbeiten.
app.directive("watch", function () {
return function (scope, element, attr) {
scope.$watch("watch", function(oldValue, newValue) {
if(newValue) {
console.log("there is a new value");
console.log("the new value is " + newValue);
}
});
}
});
Füge ich die-Uhr-Attribut, das die <body>
- tag, aber es scheint nicht zu funktionieren, wenn das dom verändert wird nichts protokolliert. Eigentlich würde ich gern ersetzen Sie die Konsole.Protokoll mit $kompilieren, aber ich muss zuerst, um die Uhr zu arbeiten. Kann mir jemand zeigen was ich falsch mache?
- Dies alles scheint wie ein sehr schlechtes design. Warum nicht Eckig laden Sie die PHP und steckte es in das div mit der
ng-inlude
oder routing? - Ich wusste nicht, bauen Sie die ursprüngliche Anwendung hatte ich auch so gemacht, das ist, wie ich es getan hätte. Wie es ist, ich versuche nur, um einige änderungen vorzunehmen, was schon da ist.
- Sicherlich könnte man hinzufügen, eine ng-app="myModule" der <html> - Tags in die original-app?
Du musst angemeldet sein, um einen Kommentar abzugeben.
, Dass es eine schlechte Idee, aber ich werde humor.
So, wie ich erklärt habe, in meine Kommentare oben, dass es eine schlechte Idee das zu tun, was Sie zu tun versuchen. Das sagte, wenn Sie wollen immer noch diesen Weg gehen, können Sie
$watch
nur über etwas, indem man eine Funktion als ersten parameter.Den code unten überprüfen, um zu sehen, ob der HTML-in die
<body>
tag geändert hat. Bitte beachten Sie, dass dies ist eine SCHRECKLICHE Idee.Die Uhr oben wird das Feuer jederzeit ALLES in den HTML-änderungen.
Zusätzliche Info: Wie der jetzt in eine ganze Reihe von Browsern, es ist nicht wirklich ein guter Weg, um zu überwachen, für die neue DOM-Elemente, die geladen wurden. Der beste Weg ist immer noch auszulösen in dem moment etwas die neue DOM-Elemente Hinzugefügt wurden.
As of right now, in almost all browsers, there's not really a good way to monitor for new DOM elements which have been loaded.
- wasMutationObserver
? Andere als IE, es hat ziemlich gute UnterstützungErwähnt Steinway Wu, MutationObserver ist der Weg zu gehen. Hier ist ein snippet :
Habe ich ein kleines utility service
hier ist der code
in
GenericService.js
wir haben dieseeinfach und Sie können es verwenden, wie
hier ist ein Beispiel für eine Verwendung
Wie bereits erwähnt hier (Mutation Events), können Sie hinzufügen von Listenern für das DOM-mutation-events wie
DOMSubtreeModified
.z.B.
element.addEventListener("DOMSubtreeModified", function (ev) {...}, false)
Update
Und tatsächlich, Sie empfehlen die Verwendung Mutation Observer statt.
Ich weiß, das ist ein altes Thema, aber ich habe ein ähnliches problem erlebt, wenn Sie versuchen zu erkennen, änderungen in den Inhalt eines Elements, gefüllt mit HTML-code dynamisch aus dem Modell mit
ng-bind-html
.Was assoziieren einige benutzerdefinierte Daten zu den Kindern Ihrer
ng-bind-html
element mit jqLite istdata()
zu erkennen, ob der Inhalt ersetzt wurde (und daher die benutzerdefinierten Daten verloren)?.Dies wäre der code einer
directive
zu beobachten, die änderungen an einem element gefüllt mitng-bind-html
:Ich hoffe, es hilft.
Kommentare sind willkommen.
Rafa