gpt4 book ai didi

javascript - AngularJS:一个接一个地监听事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:57:00 25 4
gpt4 key购买 nike

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

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

更新

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

关于如何将这个全局集成到 AngularJS 项目中有什么建议吗?或者甚至作为凉亭组件?我应该将函数附加到范围还是附加到 rootScope?感谢您的帮助!

这是 Plunker 链接和代码:http://plnkr.co/edit/slfvUlFCh7fAlE4IPt8o?p=preview

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
$scope.events = [];

var successiveOn = function(events, eventScope, callback, orderImportant) {
// array for the remove listener callback
var removeListenerMethods = [];
// events array that is passed to the callback method
var eventsArr = [];
// how many events are fired
var eventCount = 0;
// how many events should be fired
var targetEventCount = events.length;
// track the next event, only for orderImportant==true
var nextEvent = events[0];
// iterate over all event strings
for (var i = 0; i < events.length; i++) {
var event = events[i];
// attach an $on listener, and store the remove listener function
var removeListener = eventScope.$on(event, function(evt) {
if (evt.name == nextEvent || !orderImportant) {
++eventCount;
nextEvent = events[eventCount];
eventsArr.push(evt);
// if all events has fired, call the callback method and reset
if (eventCount >= targetEventCount) {
callback(eventsArr);
nextEvent = events[0];
eventCount = 0;
eventsArr = [];
}
}
});
removeListenerMethods.push(removeListener);
}

// the return function is a anonymous function which calls all the removeListener methods
return function() {
for (var i = 0; i < removeListenerMethods.length; i++) {
removeListenerMethods[i]();
}
}
}

// order is unimportant
var removeListeners = successiveOn(["orderUnimportant1", "orderUnimportant2", "orderUnimportant3"], $scope, function(events) {
var str = "Events in order of trigger: ";
for (var i = 0; i < events.length; i++) {
str += events[i].name + ", ";
}
$scope.events.push(str);
}, false);

$scope.$broadcast("orderUnimportant1");
$scope.$broadcast("orderUnimportant2");
$scope.$broadcast("orderUnimportant3"); // Events were triggered 1st time

$scope.$broadcast("orderUnimportant3");
$scope.$broadcast("orderUnimportant2");
$scope.$broadcast("orderUnimportant1"); // Events were triggered 2nd time, order doesn't matter
removeListeners();

// order is important!
var removeListeners = successiveOn(["OrderImportant1", "OrderImportant2", "OrderImportant3"], $scope, function(events) {
var str = "Events in order of trigger: ";
for (var i = 0; i < events.length; i++) {
str += events[i].name + ", ";
}
$scope.events.push(str);
}, true);

$scope.$broadcast("OrderImportant1");
$scope.$broadcast("OrderImportant2");
$scope.$broadcast("OrderImportant3"); // Events were triggered

$scope.$broadcast("OrderImportant1");
$scope.$broadcast("OrderImportant3");
$scope.$broadcast("OrderImportant2"); // Events were NOT triggered
removeListeners();
});

最佳答案

使用 $q 服务也就是 promise。

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);

那真是该死的性感......

More info on chained promises

关于javascript - AngularJS:一个接一个地监听事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22590772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com