调用超过1 $ rootScope。$ on

时间:2018-04-16 09:19:12

标签: angularjs angularjs-controller

嘿我只是在有2 $broadcast事件时才尝试执行一部分代码,这就是我得到的。

在我的控制器中我有这个。

$rootScope.$broadcast('receivedData');

在我的controller2中

$rootScope.$broadcast('dataLoaded');

到目前为止,我有这个。

$rootScope.$on('dataLoaded',function(){
    $http({
       url:"http://api/data",
       method:"POST",
       data:{id_cliente: parseInt(getVariable("id"))},
       headers:{
             "Content-Type":"application/json;charset=utf-8",
             "Authorization" : "Bearer " + getVariable("token")
     }
   })
     .then(function(response){
           setVariable("contratos", JSON.stringify(response.data));
           $rootScope.$broadcast("cargaContratos");

   },
     function(response){
     });
})

只有在recievedDatadataLoaded被触发时我才能执行此操作。有谁知道怎么做?

1 个答案:

答案 0 :(得分:2)

也许你可以这样做:

var received = [];

$rootScope.$on('receivedData', function() {
    received.push('receivedData');
    doSomething();
})
$rootScope.$on('dataLoaded', function() {
    received.push('dataLoaded');
    doSomething();
})

doSomething() {
    if (received.indexOf('receivedData') > -1 && received.indexOf('dataLoaded') > -1) {
        // Your code here
    }
}

我建议使用服务/承诺,AngularJS默认包含一个promise库:$q。然后,您只需使用$q.all()即可。但是现在,这应该可以正常工作。

更新(承诺示例)

实际上,您已经使用了一个承诺($http),它允许使用then()进行回调。

这是一个简单的承诺设置的(copy-pastable)示例。你应该尝试一下:

服务:

app.service('promiseTest', function($q) {
    this.myPromise = function() {
        return $q(function(resolve, reject) {
            setTimeout(function() {
                resolve('hello!');
            }, 1000);
        });
    }
})

组件/控制器:

app.controller('promiseTestCtrl', function(promiseTest) {
    promiseTest.myPromise().then(function(msg) {
        console.log(msg)
    })
})

我建议和他们一起玩,更好地了解他们。

当两个调用都转换为promise时,您可以使用:

var promises = [myService.receivedData, myService.dataLoaded];

$q.all(promises).then(function() {
    // Your code
})