$animate.removeClass 在没有 $evalAsync inside 指令的情况下不起作用
$animate.removeClass not working without $evalAsync inside directive?
我创建了一个指令,该指令在模型更改时淡出和淡入视图。
app.controller('myCtrl', function($scope, $interval) {
$scope.number = 0;
$interval(function() {
$scope.number++;
}, 1000);
});
app.directive('fadeOnChange', function($timeout, $animate) {
return {
restrict: 'E',
//We output the value which will be set between fades
template: '{{theFadedValue.nv}}',
link: function(scope, elem, attr) {
//The scope variable we will watch
var vtw = attr.valueToWatch;
//We add the anim class to set transitions
$animate.addClass(elem, 'anim');
//We watch the value
scope.$watch(vtw, function(nv) {
//we fade out
var promise = $animate.addClass(elem, 'fade-it-out');
//when fade out is done, we set the new value
promise.then(function() {
scope.$evalAsync(function() {
scope.theFadedValue = {"nv": nv};
//we fade it back in
$animate.removeClass(elem, 'fade-it-out');
});
});
})
}
};
});
这是视图
<div ng-controller="myCtrl">
<h1><fade-on-change value-to-watch="number"></fade-on-change></h1>
</div>
它运行良好,但我想了解为什么我需要使用 $apply、$digest、$timeout 或 $evalAsync 来包装我对 $animate.removeClass 的调用才能使其工作?如果我不这样做,这门课就不会被删除(这让我今天下午很头疼)。
我对这四种方法很感兴趣,并了解它们的不同之处,但在这种情况下需要使用其中一种方法让我感到困惑。
普伦克
基本上异步方法不会直接运行$digest循环。$http
的特殊情况,因为它内部包裹在$scope.$apply()
内
在您的情况下,您正在等待异步的完整承诺。这就是为什么你可以使用$timeout(function(){ })
或$evalAsync
,这个角度服务包装在$scope.$apply()
&$scope.$apply()
内部运行摘要循环,所有作用域变量都会更新。
$evalAsync在 DOM 被 Angular 操纵后运行,但是 在浏览器呈现之前
此处链接以获取有关何时使用$scope.$apply()
的更多信息
希望这能消除您的疑虑。谢谢。
相关文章:
- AngularJs,在没有隔离的情况下将指令属性添加到作用域
- 在不使用隔离作用域的情况下执行函数的角度指令
- JavaScript 变量在没有指令的情况下写入其他变量
- 如何使 AngularJS 指令在不隔离作用域的情况下清楚地定义其依赖关系
- $animate.removeClass 在没有 $evalAsync inside 指令的情况下不起作用
- 在我的情况下,如何在指令中设置$emit
- 在不注入$rootScope的情况下对指令中的角度事件做出反应
- AngularJS指令在元素具有绑定值的情况下不起作用
- Angular JS自定义指令在没有ng-app指令的情况下不起作用
- 如何在不覆盖父范围的情况下将参数传递给指令
- 如何在不使用指令的情况下操作ng-if内部的元素
- 在没有自己的控制器的情况下使用指令作用域何时合适
- 你能在没有指令的情况下在ngModel上动态呈现HTML吗
- 在没有指令的情况下将模板编译成angular字符串
- 在不使用隔离范围angularjs自定义指令的情况下获取属性对象
- 如何在指令的情况下更改下拉列表的默认文本,并对指令应用所需的验证
- 我如何在不使用范围声明的情况下切换指令
- 在我的情况下,如何将数据从指令传递到父范围
- 如何在不发送HTML代码的情况下共享AngularJS指令
- 点击Shift键可以在不使用angular指令的情况下为对象添加值