1

下面的片段,Plunker 在这里:http ://plnkr.co/edit/WA6tIfqXV6dO4pbsqxu9?p=preview

我经常面临的一个挑战是在触发指令元素上的绑定时从指令范围更新控制器范围,例如“点击”。我已经通过在更改指令的范围后调用 $apply() 来使其工作,但这是否矫枉过正?

所以说我有一个恰当地命名为“值”的控制器值:

  .controller( 'coolCtrl', [ '$scope', function( $scope )
  {
    $scope.value = 1;
  }])

我想在单击指令元素后从指令中增加该值:

  .directive( 'testScope', function()
  {
    return {
      restrict: 'E',
      replace: true,
      scope: {
        value: '='
      },
      template: '<button>Increase value</button>',
      link: function( scope, element, attrs )
      {
        // Note: just using standard jqLite here
        element.on( 'click', function()
        {
          scope.value++;
          scope.$apply();
        });
      }
    };
  })

每次点击都需要调用 $apply 来更新父范围吗?如果用户正在键入,整个父作用域是否必须在每次按键时都经历一个 $digest 循环?

PS 我对 Angular 的熟悉程度令人谦卑。

4

1 回答 1

1

如果您使用的是本机浏览器事件,则必须使用$apply才能使更改对 Angular 可见。是的,如果您使用 keydown ,则会发生完整的摘要循环。但在大多数情况下,这不是问题。

如果您使用 ng-* 指令中的构建,您可能真的会减少您的代码。例如,您可以ng-click针对您的问题使用:

.directive( 'testScope', function()
  {
    return {
      restrict: 'E',
      replace: true,
      scope: {
        value: '='
      },
      controller: function($scope){
          $scope.increase = function(){
            $scope.value++;
          }
      },
      template: '<button ng-click="increase()">Increase value</button>'
    }; 
  })

如果你这样走,就不需要$apply手动调用了。这是角度的方式...

于 2014-02-09T19:03:01.350 回答