AngularJS摘要回调

时间:2014-05-09 10:23:22

标签: javascript performance angularjs caching angularjs-directive

我发现自己经常要求每个摘要周期缓存数据,例如map / reduce函数或深度嵌套的访问器。为此,设置摘要回调,清除摘要循环之前/之后的缓存值会很有用。有没有"棱角分明的方式"实现这个目标?

1 个答案:

答案 0 :(得分:8)

使用$rootScope.$watch可以做的一件事是给它一个没有"听众的功能" (所以只用一个不返回任何东西的函数来调用它)。这有效地允许您在摘要发生时通过您提供的功能得到通知。

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

每个周期这个监听器将被调用两次,但我无法判断我是否开始或没有黑客攻击。所以我可以使用一个标记来帮助我跟踪我们处于什么状态,当我们从in-digest转换到out-of-digest时,我们可以清除缓存。 In this example,我只是创建一个使用$cacheFactory创建缓存的服务并返回它,但会跟踪该状态并在适当的时候清除它。

在我粗略的例子中,似乎有道理。但是,我们就会遇到问题,因为摘要缓存可能会过早被清除。您可以在该示例的控制台消息中看到此消息,其中清除缓存后发出最后一个watch语句。这是因为我无法控制手表的顺序,以确保我的服务添加的手表是最后一个。

但是,如果我们查看$rootScope的源代码,我们会看到一个名为$$postDigest的未记录的内部函数,它将一些函数添加到队列中,该函数在摘要完成时处理。因此,我可以使用相同的技术,但使用$$postDigest推迟清理,如this example中所示。它有效,但我们正在使用内部API进行薄冰。自行承担风险。