AngularJS摘要回调

Fil*_*eca 4 javascript performance caching angularjs angularjs-directive

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

Hac*_*ese 8

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

$rootScope.$watch(function() {
    // a digest is happening.
});
Run Code Online (Sandbox Code Playgroud)

每个周期这个监听器将被调用两次,但我不知道我是否开始或没有黑客攻击.所以我可以使用一个标志来帮助我跟踪我们所处的状态,当我们从in-digest转换到out-of-digest时,我们可以清除缓存.在这个例子中,我只是创建一个使用$cacheFactory并返回它的服务来创建一个缓存,但是跟踪该状态并在适当的时候清除它.

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

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