从子控制器中调用两个父控制器作用域函数,在angular.js中一个接一个地调用

时间:2018-09-10 07:48:44

标签: angularjs methods controller angularjs-scope parent-child

我有一个来自子控制器的Angular.js方法,在这里它一个接一个地调用了twop个父控制器方法。但是第二个功能应该从第一个功能获取帐户数据,然后将更新呼叫数据,如下所示:

filter.filterAccountsByProductMetrics1 = function(productWithSegmentations12) {
    accountService.fetchAccountForRecordType([filter.selectedHcpHco.Name.display])
    .then(function(resp) {  
        $scope.accountDataUpdate({
            accounts: resp.data
        });
        var productId = null;
        if(filter.selectedMySetupProduct.Product_vod__c) {
            productId = filter.selectedMySetupProduct.Product_vod__c.value;
        }
        callService.getCallsForProductId(productId)
        .then(function(calls) {
            filter.filterRecords[filterType.product.value] = calls;
            $scope.callDataUpdate({
                calls: applyAllFilterOnCalls()
            });
        });
    });
};  

我已经检查了两个函数都被调用,但是序列没有得到维护。如何确保两个父函数被一个又一个地调用。

编辑:函数accountDataUpdate:

call.accountDataUpdate = function(accounts) {
    call.accounts = accounts;
    getCallDetails(getCallIdsFromCallsForFilteredAccount())
    .then(function() {
        updateProductFrequencyTableData();
        updateAccountDetailData(true);
    });

    updateDailyFrequencyChartData();
    updateWeeklyFrequencyChartData();
    updateCallFrequencyTableData();
    updateAccountFrequencyData();

    $timeout(function() {
        $scope.$broadcast('updateDoughnutChart');
        $scope.$broadcast('updateBarChart');
    });
};

1 个答案:

答案 0 :(得分:1)

修改accountDataUpdate以返回承诺:

call.accountDataUpdate = function(accounts) {
    call.accounts = accounts;
    var promise = getCallDetails(getCallIdsFromCallsForFilteredAccount())
      .then(function() {
        updateProductFrequencyTableData();
        updateAccountDetailData(true);

        updateDailyFrequencyChartData();
        updateWeeklyFrequencyChartData();
        updateCallFrequencyTableData();
        updateAccountFrequencyData();

        return $timeout(function() {
            $scope.$broadcast('updateDoughnutChart');
            $scope.$broadcast('updateBarChart');
        });
    });

    return promise;
};

然后使用许诺进行链接:

filter.filterAccountsByProductMetrics1 = function(productWithSegmentations12) {
    return accountService.fetchAccountForRecordType([filter.selectedHcpHco.Name.display])
      .then(function(resp) {  
        return $scope.accountDataUpdate({
            accounts: resp.data
        });
    }).then(function() {
        var productId = null;
        if(filter.selectedMySetupProduct.Product_vod__c) {
            productId = filter.selectedMySetupProduct.Product_vod__c.value;
        }
        return callService.getCallsForProductId(productId)
    }).then(function(calls) {
        filter.filterRecords[filterType.product.value] = calls;
        return $scope.callDataUpdate({
            calls: applyAllFilterOnCalls()
        });
    });
};  

由于调用promise的.then方法会返回新的派生promise,因此很容易创建promise的promise。

可以创建任意长度的链,并且由于一个承诺可以用另一个承诺来解决(这将进一步推迟其解决方案),因此可以在链中的任何点暂停/推迟对承诺的解决。这样就可以实现功能强大的API。

有关更多信息,请参见AngularJS $q Service API Reference - Chaining promises