Javascript AngularJS:一个接一个地听事件

Javascript AngularJS:一个接一个地听事件,javascript,angularjs,Javascript,Angularjs,是否有一种角度的方式来倾听一个接一个发生的事件?例如,我想在$rootScope上监听$routeChangeSuccess和$viewContentLoaded事件。当第一个事件发生后,第二个事件发生时,我想调用回调 这可能吗?还是我必须自己写?配置事件的顺序是否重要也很好。或者有什么想法,如何实施这种行为 更新 因为我没有在网上找到任何东西,所以我想出了自己的解决方案。我认为这是可行的,但我不知道这种方法是否有缺点 以及如何将这个全球项目整合到AngularJS项目中的建议?或者甚至作为一个

是否有一种角度的方式来倾听一个接一个发生的事件?例如,我想在
$rootScope
上监听
$routeChangeSuccess
$viewContentLoaded
事件。当第一个事件发生后,第二个事件发生时,我想调用回调

这可能吗?还是我必须自己写?配置事件的顺序是否重要也很好。或者有什么想法,如何实施这种行为

更新

因为我没有在网上找到任何东西,所以我想出了自己的解决方案。我认为这是可行的,但我不知道这种方法是否有缺点

以及如何将这个全球项目整合到AngularJS项目中的建议?或者甚至作为一个鲍尔组件?我应该将函数附加到作用域还是根作用域?感谢您的帮助

以下是Plunker链接和代码:

var-app=angular.module('plunker',[]);
应用程序控制器('MainCtrl',函数($scope){
$scope.events=[];
var successiveOn=函数(事件、eventScope、回调、orderImportant){
//移除侦听器回调的数组
var removeListenerMethods=[];
//传递给回调方法的事件数组
var-eventsArr=[];
//触发了多少个事件
var-eventCount=0;
//应该触发多少个事件
var targetEventCount=events.length;
//跟踪下一个事件,仅针对orderImportant==true
var nextEvent=events[0];
//迭代所有事件字符串
对于(var i=0;i=targetEventCount){
回调(eventsArr);
nextEvent=事件[0];
eventCount=0;
eventsArr=[];
}
}
});
removeListenerMethods.push(removeListener);
}
//返回函数是一个匿名函数,它调用所有removeListener方法
返回函数(){
对于(var i=0;i
使用
$q
服务,即承诺

var routeChange = $q.defer();
var contentLoaded = $q.defer();

$rootScope.$on("$routeChangeSuccess", function() {
  routeChange.resolve();
});

$rootScope.$on("$viewContentLoaded", function() {
  contentLoaded.resolve();
});

$q.all([contentLoaded.promise, routeChange.promise]).then(function() {
  //Fire your callback here
});
具体顺序:

routeChange.then(function() {
  contentLoaded.then(function () {
     //Fire callback
  });
});
没有令人讨厌的汤:

var routeChangeHandler = function() {
  return routeChange.promise;
}

var contentLoadedHandler = function() {
  return contentLoaded.promise
}

var callback = function() { 
  //Do cool stuff here
}

routeChangeHandler
  .then(contentLoadedHandler)
  .then(callback);
真他妈性感


如果你想用纯AngularJS设施来解决这个问题,我认为Stens answer是最好的解决方法。然而,经常有这样的情况表明,您必须定期处理更复杂的事件stuf。如果是这样的话,我建议你去看看和桥接库

使用JavaScript的反应式扩展(RxJS),您可以将代码简化为:

Rx.Observable.combineLatest(
    $rootScope.$eventToObservable('$routeChangeSuccess'),
    $rootScope.$eventToObservable('$viewContentLoaded'),
    Rx.helpers.noop
)
.subscribe(function(){
    //do your stuff here
})

嗯,使用另一个库不是我想要的。但我不知道那个图书馆,而且它看起来很酷,谢谢!)是的,完全可以理解。但是Rx真的很震撼,所以我想我在这里分享一下。如果你喜欢的话,考虑一下投票;嘿,谢谢你的回答。您的解决方案看起来更干净,但它缺乏检查事件是否按特定顺序发送的能力。你知道如何使用
.all
方法
$q
来处理这个问题吗?
Rx.Observable.combineLatest(
    $rootScope.$eventToObservable('$routeChangeSuccess'),
    $rootScope.$eventToObservable('$viewContentLoaded'),
    Rx.helpers.noop
)
.subscribe(function(){
    //do your stuff here
})