2015-06-09 6 views
20

$scope.$apply wird nicht mehr Teil von Angular 2 sein. Wie können wir Angular wissen lassen, das DOM zu aktualisieren, wenn eine der gebundenen Eigenschaften außerhalb des regulären Winkels geändert wurde?

von a blog post by Minko Gechev Genommen:

Nicht mehr $ scope $ gelten

Aber wie dann AngularJS weiß, dass etwas außerhalb es hat einen Ausführungskontext stattgefunden.? Lets denken, wo die Änderungen aus kommen könnte:

  • SetTimeout
  • setInterval
  • prompt (ja, es gibt Leute, die es immer noch verwenden ...)
  • XMLHttpRequest
  • WebSockets

  • ...

, für die die Antwort lautet:

enter image description here

Ich verstehe, dass der Browser integrierte JavaScript-Funktionen Patchen von Änderungen an Eckige benachrichtigen ist etwas, das in einer relativ sicheren Art und Weise durchgeführt werden kann (ohne Einführung von subtilen Bugs) und wäre sehr praktisch für den Entwickler. Aber was ist mit APIs von Drittanbietern (wie jQuery.fadeIn) oder wenn der Browser einige neue asynchrone API verfügbar macht, die nicht abgedeckt sind? Was ist der Ersatz für alte $scope.$apply?

Antwort

15

Also die Bibliothek, die all diese Affe Patching ist zone.js.

jQuery.fadeInsetInterval nennt, ist setInterval Affe gepatcht, so lange wie Sie jQuery.fadeIn innerhalb eines zone.run genannt.

zone.fork und zone.run Art ersetzen von $scope.$apply, aber es ist anders, weil es selbst erkennt, wenn asynchrone Dinge fertig sind, während Sie $scope.$applymanuell rufen, wenn Sie Dinge wissen beendet haben. Siehe auch diese Frage + Antwort: Use zone.js to detect current execution context from anywhere?

, wenn der Browser eine neue asynchrone API zeigt, die nicht abgedeckt?

Ich denke, dass sie das auch patchen werden.

Wenn alles andere fehlschlägt, können Sie immer noch zone.afterTask() manuell aufrufen.
Ich denke, das ist, was Sie für :)

suchen
+0

Vielen Dank! Genau das, was ich gesucht habe. –

+0

Ich sehe einige interne Google-Sachen wie https://github.com/sararob/angular2base/blob/master/src/firebasepipe.ts mit einem ChangeDetectorRef - jemand weiß, ob das die neue Schärfe ist und die zone.afterTask () Methode ist veraltet? Oder was ist die Beziehung dort? – OverclockedTim

+0

zone.afterTask() macht überhaupt nichts für mich. Muss ich etwas tun, um nach Änderungen an ng2-Ansichten zu suchen? –

19
  1. Import NgZone von Kern
  2. private zone: NgZone in Ihrem Konstruktor
  3. this.zone.run(() => {}); wo Sie normalerweise scope.$apply

oder

  1. ChangeDetectorRef
  2. private chRef: ChangeDetectorRef
  3. chRef.detectChanges();
+0

Dies ist die perfekte Lösung! ... Danke –

Verwandte Themen