2016-07-05 7 views
0

Ich habe nach Lösungen dafür gesucht, aber in meinem Fall scheint nichts zu funktionieren.angular1: Wie kann man warten, bis sich das Versprechen im übergeordneten Controller löst?

Ich teile Daten zwischen zwei Winkeln Controllern in Coffeescript wie folgt:

angular.module('app').controller 'accountCtrl', ($scope, $state, accountFactory) -> 

    Api.Account.get(token: $scope.current_user.account_id).$promise.then ((response) -> 
     accountFactory.set(response) 
     $scope.account = accountFactory.account 
    ) 

angular.module('app').controller 'accountPaymentMethodsCtrl', ($scope, $state, Api, accountFactory) -> 

    $scope.account = accountFactory.account 
    $scope.displayedPaymentMethods = [].concat($scope.account.payment_methods) 

Und ich die Daten in einer Fabrik in etwa so:

angular.module('app').factory 'accountFactory', -> 

    account = { 
     payment_methods: {} 

     set: (account) -> 
      @account = account 
      @account.payment_methods = account.payment_methods 
    } 

    account 

Hier ist das Problem: Wenn ich Aktualisieren Sie die Seite,

$scope.displayedPaymentMethods = [].concat($scope.account.payment_methods) 

wirft

nicht Eigentum 'payment_methods' undefinierter

weil $ scope.account in der übergeordneten Steuerung gelesen noch nicht abgeklungen ist. Wie bekomme ich diese Zeile

$scope.displayedPaymentMethods = [].concat($scope.account.payment_methods) 

und andere zu laufen, nachdem $ scope.account im übergeordneten Controller wurde behoben?

Antwort

1

Nun, wickeln unter API-Aufruf

Api.Account.get(token: $scope.current_user.account_id).$promise.then ((response) -> 
    accountFactory.set(response) 
    $scope.account = accountFactory.account 
) 

und in accountPaymentMethodsCtrl Aufruf dieser Funktion und Versprechen warten funktionieren wie in accountCtrl zu lösen.

Das wird funktionieren :)

Prost!

0

Speichern Sie Ihre Kontoinformationen ‚lokale Speicher‘ oder ‚Cookie‘ und rufen die Daten

0

Wenn der übergeordnete Controller und der untergeordnete Controller auf verschiedenen Routen sind, können Sie die Route auflösen, um den untergeordneten Controller warten zu lassen. https://johnpapa.net/route-resolve-and-controller-activate-in-angularjs/

Wenn nicht, dann würde ich vorschlagen, eine Fabrik zu schreiben, um die Daten zu speichern und diese in beiden Controllern zu verwenden.