angular1:如何等待父控制器中的promise解析?

时间:2016-07-05 04:17:21

标签: javascript angularjs coffeescript

我已经为此寻找解决方案,但在我的案例中似乎没有任何效果。

我在coffeescript中的两个角度控制器之间共享数据,如下所示:

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)

我将数据存储在工厂中:

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

    account = {
        payment_methods: {}

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

    account

这是问题所在: 当我刷新页面时,

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

引发

  

无法读取未定义

的属性'payment_methods'

因为父控制器中的$ scope.account尚未解析。我如何得到这一行

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

和其他在父控制器中的$ scope.account解析后运行?

3 个答案:

答案 0 :(得分:1)

好吧,将API调用包含在函数

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

并在accountPaymentMethodsCtrl中调用此函数并等待承诺解决,就像您在accountCtrl中所做的那样。

这将有效:)

干杯!

答案 1 :(得分:0)

使用'本地存储'存储您的帐户信息。或者' cookie'并检索数据

答案 2 :(得分:0)

如果父控制器和子控制器在不同的路由上,那么您可以使用路由解析来使子控制器等待。 https://johnpapa.net/route-resolve-and-controller-activate-in-angularjs/

如果不是,那么我建议写一个工厂来存储数据并在两个控制器中使用它。