JavaScript AngularJs - Endlosschleife, warum?

Hendoul

Commander
Registriert
Apr. 2008
Beiträge
2.067
Hi :)

Ich habe eine Directive die ich so aufrufe:

HTML:
<my-directive minimum-date="$ctrl.getMinimumDate()">
</my-directive>

Der JS code dazu:
Javascript:
angular
    .module('blub')
    .component('myDirective', {
        templateUrl: 'blibla.html',
        controller: 'xyzController',
        bindings: {
            minimumDate: '<',
        }
    })...

Und der Aufruf von $ctrl.getMinimumDate():
Javascript:
$ctrl.getMinimumDate = function () {
    return new Date($ctrl.xyz.minimumDate);
};

Ich verstehe, dass 'new' das Problem ist und die Endlosschleife verursacht:
10 $digest() iterations reached. aborting

Aber ich verstehe nicht ganz, warum $ctrl.getMinimumDate überhaupt sovielmal aufgerufen wird?

Ist meine Vermutung richtig, dass bindings IMMER 2mal aufgerufen werden (auch beim ersten rendern) und wenn die Werte eines Bindings beim 2. Durchgang nicht übereinstimmen mit dem 1. Durchgang, dann wird nochmals ein Durchgang (digest cycle) durchgeführt?
 
<my-directive minimum-date="$ctrl.getMinimumDate">

mal so probiert?
 
  • Gefällt mir
Reaktionen: blackbirdone
Bin zum Glück seit 3 Jahren nur noch in Angular unterwegs, aber ja, du dürftest Recht haben.
Soweit ich das auch noch im Kopf habe vergleicht Angular die Werte, wenn es einen Unterschied gibt (was durch new Date eben immer gegeben ist), dann rendert Angular neu und vergleicht wieder.

Die Lösung von e_Lap dürfte funktionieren, wenn du in deiner "my-directive" das mit "&" bindest wenn ich mich nicht irre?
Aber die bessere Lösung (falls das Datum nicht super dynamisch sein muss) wäre schlicht, das Datum inital festzulegen:
Javascript:
$ctrl.minimumDate = new Date($ctrl.xyz.minimumDate);
und im Template dann eben die property nutzen.

Geht natürlich nur, wenn es reicht, wenn das minimumDate einmal bei Initalisierung des Controllers gesetzt wird.
 
Mir ging es eher darum zu verstehen warum das 2mal aufgerufen wird und dadurch dann in eine Endlosschleife mündet.
 
Zurück
Oben