2017-11-13 3 views
0

Es gibt 1 eckige App, mit 1 Eltern-Controller und einem Kind-Controller. In dem Kind gibt es 1 $ Uhr WATCH-CHILD für OBJ-CHILD, die ein $ emit auslöst. Im Parent gibt es einen Listener für das $ emit, wir nennen es ON-LISTENER und ein $ watch WATCH-PARENT für OBJ-PARENT (das true als drittes Argument verwendet).Winkeluhr nicht gefeuert

Wenn das OBJ-CHILD des Kindes geändert wird, löst es WATCH-CHILD aus, wodurch das $ -Empfang ausgelöst wird. Der übergeordnete Listener ON-LISTENER wird ausgelöst und ändert OBJ-PARENT. Außerdem werden einige $ location-Eigenschaften festgelegt. Die $ Uhr WATCH-PARENT für OBJ-PARENT wird nie ausgelöst (auch wenn der Wert geändert wurde), sowie die Eigenschaften auf $ location nicht in der Browser-URL geändert (ich weiß, dass sie tatsächlich innerhalb des JavaScript geändert werden, Ursache Ich drucke sie).

Um sicherzustellen, dass ON-LISTENER innerhalb eines $ digest aufgerufen wird, habe ich versucht, $ digest am Ende von ON-LISTENER aufzurufen, und habe die erwartete Ausnahme erhalten.

Irgendeine Idee, wenn ich etwas falsch mache? Ich erwarte, dass die Änderungen, die in ON-LISTENER auftreten, WATCH-PARENT und Browser-URL-Änderung auslösen.

Ich werde versuchen, auf jsfiddle zu reproduzieren und diesen Beitrag zu bearbeiten, wenn erfolgreich.

Der Code sieht so aus:

KIND:

$scope.$watch('vars.model', function(newValue, oldValue) { 
    console.log('model changed'); 
    $scope.$emit('highlightChange', newValue); 
}, true); 

ELTERN:

$scope.$watch('vars.model.highlight', function(newValue, oldValue) { 
    console.log('highlight changed'); 
}, true); 

$scope.$on('highlightChange', function(event, value) { 
    console.log('listener', $scope.vars.model.highlight.categoryId, value.categoryId); 
    $location.search('category-id', value.categoryId); 
    $scope.vars.model.highlight.categoryId = value.categoryId; 
} 
+0

* Jede Idee werden sollte, wenn ich etwas falsch tue? *: Nein, da Sie didn‘ t posten Sie einen beliebigen Code. Beschreiben Sie Ihren Code nicht. Veröffentliche es. –

+0

@yinonby Habe ich richtig verstanden, willst du auf kindliche Variablenänderungen hören? –

Antwort

1

Das nächste Mal bitte mehr Code bereitzustellen, die funktioniert, dass die Art und Weise Sie bessere Antworten bekommen können.

Hier ist ein Demo plunker, den ich erstellt habe, um den Code zu testen, den Sie zur Verfügung gestellt haben. Es funktioniert gut. Wenn Sie mehr Code zur Verfügung stellen könnten, könnten wir den wahren Grund finden, warum es nicht funktioniert hat.

Ich habe zwei Controller parentCtrl und childCtrl, die Ihren Code und Gegenstand der vorgesehenen Struktur verwendet.

$scope.vars = { 
    model:{ 
     highlight:{ 
     categoryId : 5 //This value is set for testing purposes 
     } 
    } 
}; 

Auch änderte ich Uhr Ziel (vars.model ->vars.model.highlight) die gleichen wie im Mutter Controller

$scope.$watch('vars.model.highlight', function(newValue, oldValue) { 
    console.log('child model changed (new/old)', newValue, oldValue); 
    $scope.$emit('highlightChange', newValue); 
    console.log('Emited change event'); 
}, true); 
0

Vielen Dank für die Hilfe. Ich fand heraus, dass mein Ereignis von einem manuellen Aufruf von $ scope. $ Digest() herrührte, weil das Ursprungsereignis von einem Ereignis "apply.daterangepicker" ausgelöst wurde. Als ich das auf $ scope. $ Apply änderte, schien das Problem wegzugehen. Ich kann davon ausgehen, dass $ apply() derjenige ist, der $ watch anruft, solange es Änderungen gibt, und dass $ digest() dies nicht tut.

Für die Zukunft, stellte ich das Problem hier: https://plnkr.co/edit/ItkALhw16Aqukk3EFrRz?p=preview

$scope.digest(); 

$scope.apply(); 
Verwandte Themen