事件构成
Event compositions
我在一个指令中有三个 $watches。
我想 doSomething 只有在所有三个 $watch 侦听器都被触发后。
在第一次调用 doSomething 之后,每次 $watch 监听器触发时我都想 doSomething将来。
我可以跟踪之前是否已解决各种手表并实现我想要的行为,但我想知道是否有更简单的方法。也许 RxJS 可以帮助我?
下面的天真方法...我不想在我的应用程序逻辑中跟踪此信息。
var hasAResolved = false;
var hasBResolved = false;
var hasCResolved = false;
$scope.$watch('a', setAToResolvedAndMaybeDoSomething);
$scope.$watch('b', setBToResolvedAndMaybeDoSomething);
$scope.$watch('c', setCToResolvedAndMaybeDoSomething);
function doSomething(){...};
Angular 内置了 Kris Kowal's Q style api, $q
,您可以将其与 all
函数一起使用。
编辑:
根据@dfsq 的评论,我最初错过了您问题的关键点。我已经更新了下面的代码示例,以考虑允许重复调用 doSomething
。
var a = $q.defer();
var b = $q.defer();
var c = $q.defer();
$scope.$watch('a', function() {
// do something with a
a.resolve();
});
$scope.$watch('b', function() {
// do something with b
b.resolve();
});
$scope.$watch('c', function() {
// do something with c
c.resolve();
});
var doSomething = function() {
// do some stuff
};
$q.all([a.promise, b.promise, c.promise]).then(function() {
doSomething();
// set a,b,c so that calling resolve will delgate to the `doSomething` function
a = b = c = {
resolve: doSomething
};
});
我在一个指令中有三个 $watches。
我想 doSomething 只有在所有三个 $watch 侦听器都被触发后。
在第一次调用 doSomething 之后,每次 $watch 监听器触发时我都想 doSomething将来。
我可以跟踪之前是否已解决各种手表并实现我想要的行为,但我想知道是否有更简单的方法。也许 RxJS 可以帮助我?
下面的天真方法...我不想在我的应用程序逻辑中跟踪此信息。
var hasAResolved = false;
var hasBResolved = false;
var hasCResolved = false;
$scope.$watch('a', setAToResolvedAndMaybeDoSomething);
$scope.$watch('b', setBToResolvedAndMaybeDoSomething);
$scope.$watch('c', setCToResolvedAndMaybeDoSomething);
function doSomething(){...};
Angular 内置了 Kris Kowal's Q style api, $q
,您可以将其与 all
函数一起使用。
编辑:
根据@dfsq 的评论,我最初错过了您问题的关键点。我已经更新了下面的代码示例,以考虑允许重复调用 doSomething
。
var a = $q.defer();
var b = $q.defer();
var c = $q.defer();
$scope.$watch('a', function() {
// do something with a
a.resolve();
});
$scope.$watch('b', function() {
// do something with b
b.resolve();
});
$scope.$watch('c', function() {
// do something with c
c.resolve();
});
var doSomething = function() {
// do some stuff
};
$q.all([a.promise, b.promise, c.promise]).then(function() {
doSomething();
// set a,b,c so that calling resolve will delgate to the `doSomething` function
a = b = c = {
resolve: doSomething
};
});