我构建了一个简单的指令,添加了一个基于 javascript 的加载动画。它正在window.setInterval()
循环运行。这很好用,但是当加载完成时,我使用ngSwitch
交换我的内容,这会从页面中删除包含加载指令属性的元素。
理想情况下,我想注意这种变化并清除我的间隔,这样动画计算就不会在后台运行。我尝试观看一个自定义函数来评估页面上元素的存在。我知道该函数可以检测到这一点,但似乎时间是一个问题——据我所知,$watch
当指令属性的元素离开页面时,它本身就被清除了。因此,我$watch
的 'ed 表达式永远不会检测到更改,也永远不会调用清除动画间隔函数的回调。
是否有处理这种情况的推荐模式?
我的模板中的相关片段:
<div ng-switch on="dataStatus">
<div ng-switch-when="loading">
<div loading-spinner></div>
</div>
<div ng-switch-when="haveData">
<!-- data dependent on content we were loading -->
</div>
</div>
我的指令的简化版本:
myModule.directive('loadingSpinner', function () {
var updateMySweetAnimation = function (element) { /* ... */ };
return {
link: function (scope, iElement, iAttrs) {
var spinner = window.setInterval(function () {
updateMySweetAnimation(iElement);
}, 100);
scope.$watch(function () {
return $(document).find(iElement).length;
}, function (present) {
if (!present) {
clearInterval(spinner);
}
});
}
};
});