当前位置: 首页 > 知识库问答 >
问题:

AngularJS$Digest已在指令的链接中的$APPLY之后运行

边霄
2023-03-14

我正在用一个指令计算html元素的最小高度,当我试图通过scope.$apply()更新父作用域值时,我得到以下错误:$digest已经在进行

<header id="headerFR"> header content here </header>
<main id="contentFR" main-min-height ng-style="{'min-height': calcMinHeight}">
    {{calcMinHeight}}
    <welcome:info></welcome:info>
    <button type="button" class="appTOS">{{tosBtnLbl}}</button>
</main>
<footer id="footerFR"> footer content here </footer>
FIRSTRUN.controller('WelcomeCtrl', ['$scope', '$location', function($scope, $location){
    ...
    $scope.calcMinHeight;
    ...
}]);

我的指示是:

FIRSTRUN.directive('mainMinHeight', ['$window', function($window){
    return{
        restrict: 'A',
        scope: { calcMinHeight: '=' },

        link: function(scope, el, attrs){
            var headerHeight = angular.element('header').outerHeight();
            var windowHeight = angular.element($window).height();

            var mainMinHeight = windowHeight - headerHeight;
            scope.$parent.calcMinHeight = mainMinHeight + 'px';
            scope.$apply();

        }
    }
}])

我总是可以使用scope.$parent.calcminheight更新父作用域值,但在这种情况下,指令的作用域规则将不起作用(例如,如果我想通过“@”隔离作用域,则ctrl仍将接收更新)。

此外,我可以通过angluar.element(el).css('min-height‘,mainminheight+'px')设置min-height值,但我希望以角度的方式进行。

问题出在哪里?
*使用angular 1.3.5处理任何问题。

要解决这个错误,只需删除scope.$apply()行就够了,因为我已经在$digest循环中了,正如@enzey&@andrew Counts所说的。
另外,我误解了作用域的工作方式,我需要更好的概述,我在这里找到了它。
我只是认为指令可以有自己的作用域,就像ctrls一样,这是一开始就存在的问题。

共有1个答案

许马鲁
2023-03-14

如果您的代码在摘要过程中调用$APPLY,则会发生此错误。一种可能的解决方法是将代码包装在对$TIMEOUT服务的调用中:

//add $timeout to controller parameters
$timeout(function(){
  ///...
  scope.$parent.calcMinHeight = mainMinHeight + 'px';
  //timeout will automatically trigger an $apply
}, 0);

这将提供允许浏览器在执行高度计算之前进行渲染的附加好处

 类似资料:
  • 问题内容: 如果我有一个指令可以响应示波器上特定属性的状态,并且我想在测试中更改该属性并验证其是否正确响应,那是进行此更改的最佳方法? 我已经看过这两种模式: 和 它们之间有什么区别,哪个更好,为什么? 问题答案: 会在当前范围及其所有子级上触发监视程序。将评估传递的函数并运行。 第一个更快,因为它需要评估观察者的当前范围及其子级。第二个比较慢,因为它需要评估观察者及其所有子作用域。 当其中一个观

  • 本文向大家介绍angularjs 中$apply,$digest,$watch详解,包括了angularjs 中$apply,$digest,$watch详解的使用技巧和注意事项,需要的朋友参考一下 如果你对angular的$apply,$digest,$watch似懂非懂,那我相信下面几句话能让你深刻理解! 此文针对已经了解过$apply,$digest,$watch的同学。也就是说你已经在很多

  • 有没有人知道如何避免这个错误,或者实现同样的事情,但以不同的方式?

  • 问题内容: 我发现自从以角度构建应用程序以来,我需要越来越多地手动将页面更新到我的范围。 我唯一知道的方法是从控制器和指令的范围进行调用。问题是它不断向显示以下内容的控制台抛出错误: 错误:$ digest已经在进行中 有谁知道如何避免这种错误或以不同的方式实现相同的目的? 问题答案: 不要使用此模式 -最终将导致更多错误,无法解决。即使您认为它可以修复某些问题,也没有。 您可以通过检查来检查a

  • 问题内容: 我有一种情况,我想在创建的DOM上运行自定义指令。 基本上,我必须自定义html标记的行为,因为正在加载的html是不安全的,并且当用户单击链接时,我必须在jqLit​​e事件发生之前执行某些功能。 因此,我最初的想法是创建一个指令,该指令会修改我放置指令属性的容器内部任何容器的行为。 正常工作,直到与结合使用,我的指令在将字符串编译为html并附加到DOM 之前运行。 那么,在运行之