Ich arbeite an einer Ajax-App mit jQuery und AngularJS.
Wenn ich den Inhalt (der AngularJS-Bindungen enthält) eines div mit der html
Funktion von jQuery aktualisiere, funktionieren die AngularJS-Bindungen nicht.
Das Folgende ist der Code dessen, was ich versuche zu tun:
$(document).ready(function() {
$("#refreshButton").click(function() {
$("#dynamicContent").html("<button ng-click='count = count + 1' ng-init='count=0'>Increment</button><span>count: {{count}} </span>")
});
});
</style><script src="http://docs.angularjs.org/angular-1.0.1.min.js"></script><style>.ng-invalid {
border: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="">
<div id='dynamicContent'>
<button ng-click="count = count + 1" ng-init="count=0">
Increment
</button>
<span>count: {{count}} </span>
</div>
<button id='refreshButton'>
Refresh
</button>
</div>
Ich habe dynamischen Inhalt in einem Div mit der ID #dynamicContent
und ich habe eine Aktualisierungsschaltfläche, die den Inhalt dieses Div aktualisiert, wenn auf Aktualisieren geklickt wird. Inkrement funktioniert wie erwartet, wenn ich den Inhalt nicht aktualisiere, aber nach dem Aktualisieren funktioniert die AngularJS-Bindung nicht mehr.
Dies ist in AngularJS möglicherweise nicht gültig, aber ich habe zunächst eine Anwendung mit jQuery erstellt und später mit der Verwendung von AngularJS begonnen, sodass ich nicht alles nach AngularJS migrieren kann. Jede Hilfe, um dies in AngularJS zum Laufen zu bringen, wird sehr geschätzt.
Antworten:
Sie müssen
$compile
die HTML-Zeichenfolge aufrufen, bevor Sie sie in das DOM einfügen, damit Angular die Möglichkeit hat, die Bindung auszuführen.In deiner Geige würde es ungefähr so aussehen.
$compile
Muss natürlich in Ihren Controller injiziert werden, damit dies funktioniert.Lesen Sie mehr in der
$compile
Dokumentation .quelle
$scope.$apply()
in dierefresh()
Funktion selbst verschieben, wenn dies für Ihre Architektur sinnvoll istangular-1.0.1.min.js
in den Originalbeispielen war 404. Hier sind aktualisierte Arbeitsversionen von @ ArtemAndreev-s Beispiel: jsfiddle.net/pmorch/fABdD/186 und @NoahFreitas Beispiel: jsfiddle.net/pmorch/8xkeh/43Eine weitere Lösung für den Fall, dass Sie keine Kontrolle über dynamische Inhalte haben
Dies funktioniert, wenn Sie Ihr Element nicht über eine Direktive geladen haben (dh wie im Beispiel in den kommentierten jsfiddles).
Packen Sie Ihre Inhalte ein
Wickeln Sie Ihren Inhalt in ein div, damit Sie ihn auswählen können, wenn Sie JQuery verwenden . Sie können auch natives Javascript verwenden, um Ihr Element zu erhalten.
Winkelinjektor verwenden
Sie können den folgenden Code verwenden, um einen Verweis auf $ compile abzurufen, wenn Sie keinen haben.
Zusammenfassung
Der ursprüngliche Beitrag schien davon auszugehen, dass Sie eine $ compile-Referenz zur Hand hatten. Es ist offensichtlich einfach, wenn Sie die Referenz haben, aber ich habe es nicht getan, also war dies die Antwort für mich.
Eine Einschränkung des vorherigen Codes
Wenn Sie ein asp.net / mvc-Bundle mit Minify-Szenario verwenden, treten Probleme bei der Bereitstellung im Release-Modus auf. Das Problem tritt in Form eines nicht erfassten Fehlers auf: [$ injor: unpr], der durch den Minifier verursacht wird, der mit dem eckigen Javascript-Code herumspielt.
Hier ist der Weg, um Abhilfe zu schaffen :
Ersetzen Sie das vorherige Code-Snippet durch die folgende Überladung.
Dies verursachte mir viel Kummer, bevor ich es zusammensetzte.
quelle
Ergänzung zu @ jwizes Antwort
Weil
angular.element(document).injector()
es einen Fehler gabinjector is not defined
Also habe ich eine Funktion erstellt, die Sie nach einem AJAX-Aufruf oder wenn DOM mit jQuery geändert wird, ausführen können.Verwenden Sie es, indem Sie nur den Selektor eines neuen Elements übergeben. so was
quelle
target
dynamisch machen, indem Sie es aus dem Argument nehmen.