gpt4 book ai didi

javascript - 计算 Angular 的 $digest 周期

转载 作者:可可西里 更新时间:2023-11-01 01:25:08 27 4
gpt4 key购买 nike

tl;博士:

我想在页面加载时有 Angular 触发 css 动画。有没有办法在 Controller 或指令中计算 Angular 的摘要周期?


长版:

我有一些 Angular 动画,我想在页面加载时运行,使用 ng-enter、ng-leave、ng-move 等等...和 ​​ng-repeat 指令。

从 1.3.6 开始,我知道 Angular 会等待应用任何动画,直到发生 2 个摘要循环后,所以这些动画根本不会发生,因为数据(几乎总是)加载到第一个摘要的 View 中我的申请周期。(酱汁:https://docs.angularjs.org/api/ngAnimate#css-staggering-animations)

我想知道是否有某种方法可以计算摘要周期并触发动画,或者在第二个摘要周期后加载数据?

此外,如果我等到 2 个摘要周期,是否存在在某些情况下不会出现第二个周期的风险,这意味着我的数据不会加载到 View 中?如果是这种情况,有没有办法保证每次至少会发生 2 个摘要循环?

作为临时修复,我使用 $timeout 在 500 毫秒后加载我的数据,但我知道这是一个非常糟糕的主意。


相关代码:

(由于这个项目的保密协议(protocol),更改了某些东西的一些名称)

html:

<div ng-repeat="pizza in pizzas" class="za" ng-click="bake(pizza)"></div>

css/sass(为简洁起见删除了浏览器前缀):

.za {
//other styles

&.ng-enter,
&.ng-leave,
&.ng-move {
transition: all 1s $slowOut;
transform: translate(1000px, 0px) rotateZ(90deg);
}
&.ng-enter,
&.ng-leave.ng-leave-active
&.ng-move, {
transform: translate(1000px, 0px) rotateZ(90deg);
}
&.ng-enter.ng-enter-active,
&.ng-leave,
&.ng-move.ng-move-active {
transform: translate(0, 0) rotateZ(0deg);
}
&.ng-enter-stagger,
&.ng-leave-stagger,
&.ng-move-stagger {
transition-delay: 2s;
transition-duration: 0s;
}
}

js:

// inside a controller
timeout(function() {
scope.pizza = [ // actually injecting 'myData' and using `myData.get()` which returns an array of objects
{toppings: ['cheese', 'formaldehyde']},
{toppings: ['mayo', 'mustard', 'garlic']},
{toppings: ['red sauce', 'blue sauce']}
];
}, 500);

最佳答案

正如 documentation 中指出的那样:

If you want to be notified whenever $digest is called, you can register a watchExpression function with no listener. (Since watchExpression can execute multiple times per $digest cycle when a change is detected, be prepared for multiple calls to your listener.)

因此您可以使用以下代码计算$digest:

var nbDigest = 0;

$rootScope.$watch(function() {
nbDigest++;
});


更新:关于为什么你不能依赖 HTML 的说明,如果你查看你的开发控制台,你会看到 Angular 提示无法结束一个 digect 周期(10 个周期后中止)

angular.module("test", []).controller("test", function($scope) {

$scope.digestCount = 0;

$scope.incrementDigestCount = function() {
return ++$scope.digestCount;
}

});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="test" ng-controller="test">
<div>{{incrementDigestCount()}}</div>
</body>

关于javascript - 计算 Angular 的 $digest 周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27454229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com