AngularJS digest回调

4

我发现自己经常需要按摩令牌周期缓存数据,例如,map / reduce函数或深度嵌套的访问器。为此,设置一个digest回调函数,在digest循环之前/之后清除缓存值将非常有用。是否有一种“angular方式”来实现这一点?

1个回答

8

您可以通过 $rootScope.$watch 来实现一个没有“监听器”的函数(只需使用一个并不返回任何内容的函数来调用它)。这有效地使您能够通过提供的函数在 digest 发生时得到通知。

$rootScope.$watch(function() {
    // a digest is happening.
});

每个周期该监听器会被调用两次,但我不能确定我是在开始还是结束,因此我可以使用一个标志来帮助我跟踪我们处于什么状态,并在从消化状态到非消化状态的过渡时清除我们的缓存。在这个示例中,我只是创建了一个服务,使用$cacheFactory创建缓存并返回它,但会跟踪该状态并在适当时间进行清除。
在我的粗糙示例中,这似乎是可行的。但是,我们将遇到问题,摘要缓存可能会过早地清除。您可以在该示例的控制台消息中看到这一点,在清除缓存后会发出最后一个watch语句。这是因为我无法控制监视的顺序,以确保由我的服务添加的监视是最后一个。 然而,如果我们查看$rootScope的源代码,就会看到一个未记录的内部函数$$postDigest,它将一些函数添加到队列中,在摘要完成时处理该队列。所以,我可以使用相同的技术,但是使用$$postDigest 延迟清理,如这个示例所示。它可以工作,但我们正在使用内部API玩弄火,自行承担风险。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接