Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在调用角度';单击绑定指令更新控制器$scope后是否需要应用s$apply?_Javascript_Angularjs_Jqlite - Fatal编程技术网

Javascript 正在调用角度';单击绑定指令更新控制器$scope后是否需要应用s$apply?

Javascript 正在调用角度';单击绑定指令更新控制器$scope后是否需要应用s$apply?,javascript,angularjs,jqlite,Javascript,Angularjs,Jqlite,下面是片段,请点击此处: 我经常面临的一个挑战是在指令元素上触发绑定时从指令范围更新控制器范围,例如“单击”。在更改指令的作用域后,我通过调用$apply()使其正常工作,但这是不是太过分了 因此,假设我有一个控制器值,恰当地命名为“value”: 我想在单击指令元素时从指令中增加该值: .directive( 'testScope', function() { return { restrict: 'E', replace: true, sc

下面是片段,请点击此处:

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

因此,假设我有一个控制器值,恰当地命名为“value”:

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

  .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();
        });
      }
    };
  })
.directive('testScope',function()
{
返回{
限制:'E',
替换:正确,
范围:{
值:'='
},
模板:“增加值”,
链接:函数(范围、元素、属性)
{
//注意:这里只使用标准jqLite
元素上('click',function())
{
scope.value++;
作用域:$apply();
});
}
};
})
调用$apply是否需要在每次单击时更新父作用域?如果用户正在键入,那么整个父作用域是否必须在每个键上经历$digest循环


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

如果您使用本机浏览器事件,则必须使用
$apply
使更改对Angular可见。是的,如果您使用keydown,则会出现一个完整的摘要周期。但在大多数情况下,这不是一个问题

如果使用内置ng-*指令,您可能会真正减少代码。例如,您可以使用
ng单击
解决您的问题:

.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>'
    }; 
  })
.directive('testScope',function()
{
返回{
限制:'E',
替换:正确,
范围:{
值:'='
},
控制器:功能($scope){
$scope.increase=函数(){
$scope.value++;
}
},
模板:“增加值”
}; 
})

如果这样做,则无需手动调用
$apply
。这是angular的方式…

谢谢,我想让angular知道用户做了更改是有意义的。但看起来现代网络应用程序中经常有很多活动部件,只关注改变了的东西会很好。感谢您提供的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>'
    }; 
  })