AngularJS$摘要已在指令';s链接

AngularJS$摘要已在指令';s链接,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,我正在用一个指令计算html元素的最小高度,当我试图通过scope更新父作用域值时,$apply()出现以下错误:$digest已在进行中 我知道有很多这样的话题,但没有一个解决方案适合我。 我的看法是: <header id="headerFR"> header content here </header> <main id="contentFR" main-min-height ng-style="{'min-height': calcMinHeight}"&g

我正在用一个指令计算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.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',main-minheight+'px')
设置最小高度值,但我希望以角度的方式进行设置

问题出在哪里?
*对于任何问题,使用1.3.5

答复: 要解决此错误,只需删除作用域。$apply()行,因为正如@enzey&@Andrew Counts所说,我已经在$digest循环中了。
另外,我误解了作用域的工作方式,我需要更好的概述,我发现了这一点。

我只是认为指令可以有自己的作用域,比如CTRL,这从一开始就是问题所在。

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

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

这将带来额外的好处,允许浏览器在执行高度计算之前进行渲染

很好,但角度$timeout更适合一致性,这是我的一个坏习惯。修正好了,这是可行的,我不再得到那个错误了,但是我可以通过使用
scope.$parent.calcMinHeight=mainMinHeight+'px'获得相同的行为和删除我的链接功能中的
范围。$apply
。正如@Enzey所说,如果我删除
作用域。$apply
我将消除该错误,但我的问题是:这是否适用于隔离作用域?我用ctrl键中的
calcMinHeight:'@'
$scope.$watch('calcMinHeight',fn)
进行了测试,新旧值相同,但使用计算值进行了更新。。。所以我有“@”或“=”并不重要。我误解了什么?因为您已经在摘要中,只需删除作用域。$apply()。
scope。$apply()
仅在您需要手动触发更新时才是必需的。如果已经有一个摘要在进行中,那么对
scope.$apply()
的调用无论如何都是多余的。没有调用,页面是否正常工作?是的,没有$apply()fn,页面工作正常,但我担心如果使用scope.$parent,即使我将作用域限制为与“@”隔离,它也会更新ctrl值。用“@”和$watch在我的ctrl键中的“calcMinHeight”上进行了测试,新旧值相同&即使使用“@”也会更新
//add $timeout to controller parameters
$timeout(function(){
  ///...
  scope.$parent.calcMinHeight = mainMinHeight + 'px';
  //timeout will automatically trigger an $apply
}, 0);