我在指令中有三个$ watch。
我想在触发所有三个$ watch侦听器之后 doSomething 。
首次调用 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(){...};
答案 0 :(得分:1)
Angular内置Kris Kowal's Q样式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
};
});