我发现自己经常需要在每个摘要周期缓存数据,例如,映射/归约函数或深度嵌套的访问器。为此,设置摘要回调以清除摘要循环之前/之后的缓存值会很有用。是否有一种“Angular 方式”来实现这一点?
最佳答案
你可以用 $rootScope.$watch
做的一件事是给它一个没有“监听器”的函数(所以只用一个不返回任何东西的函数来调用它)。这有效地允许您在摘要发生时通过提供的函数收到通知。
$rootScope.$watch(function() {
// a digest is happening.
});
每个周期此监听器将被调用两次,但我不知道我是在没有 hack 的情况下开始还是结束。所以我可以只使用一个标志来帮助我跟踪我们所处的状态,当我们从摘要中转换到摘要外时,我们可以清除缓存。 In this example ,我只是创建了一个服务,该服务使用 $cacheFactory
创建缓存并返回它,但会跟踪该状态并在适当的时间清除它。
在我粗略的例子中,这似乎是合理的。但是,马上我们就会遇到摘要缓存可能会过早清除的问题。您可以在该示例的控制台消息中看到这一点,其中最后一个 watch
语句在缓存被清除后 发出。这是因为我无法控制 watch 的顺序以确保我的服务添加的是最后一个。
但是,如果我们查看 $rootScope
的源代码,我们会看到一个名为 $$postDigest
的未记录的内部函数,它将一些函数添加到一个被处理的队列中当摘要完成时。因此,我可以使用相同的技术,但使用 $$postDigest
延迟清理,如 this example 中所示.它有效,但我们在使用内部 API 时如履薄冰。自行承担风险。
关于javascript - AngularJS 摘要回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23562199/