Javascript 触发自定义jquery单击角度自定义指令

Javascript 触发自定义jquery单击角度自定义指令,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我正在为multiSelect下拉菜单使用自定义指令。我需要一个自定义按钮来打开和关闭多选列表 问题:我得到的$apply已在进行中错误 解决方案:为了解决这个问题,我将jQuery函数包装在$timeout 然而,现在我可以自定义点击指令,我的multiSelect将打开,但现在如果在第二次点击时我想关闭选择框,它将闪烁并保持打开状态;( 指令: if (!parentFound) { $scope.$apply(function(){ $scope.open = fa

我正在为multiSelect下拉菜单使用自定义指令。我需要一个自定义按钮来打开和关闭多选列表

问题:我得到的$apply已在进行中错误

解决方案:为了解决这个问题,我将jQuery函数包装在$timeout

然而,现在我可以自定义点击指令,我的multiSelect将打开,但现在如果在第二次点击时我想关闭选择框,它将闪烁并保持打开状态;(

指令:

if (!parentFound) {
    $scope.$apply(function(){
        $scope.open = false;
    });
}
有人能提出一个解决方案,让我现在(在使用$timeout之后)切换多选下拉菜单,而不是只在所有单击中打开吗


将其从
$范围中删除。$apply
如图所示

if(!parentFound){
函数(){
$scope.open=false;
};
}

为此,首先需要了解$scope.$apply()

AngularJs在内部为在view中创建的所有数据绑定创建一个“监视”,并调用$scope.$digest(),它依次遍历所有监视并检查是否有任何被监视的变量已更改。当调用$scope.$apply()时,它在内部调用$scope.$digest(),以便刷新数据绑定

侦听器指令(如ng click)向DOM注册侦听器。当DOM侦听器启动时,该指令执行关联的表达式并使用$apply()方法更新视图

当接收到外部事件(如用户操作、计时器或XHR)时,必须通过$apply()方法将关联的表达式应用于作用域,以便正确更新所有侦听器()

因此,在您的示例中,$scope.$apply()已在单击事件时被调用,因此引发了一个错误


也可用于读取

仅否定
$scope
值:

$scope.$apply(function() {
  if($scope.open) { //only close when it is open
    $scope.open = !$scope.open;
  }
});
如果您希望在选择框外单击时关闭下拉列表,则可以使用另一个自定义指令,该指令在窗口上侦听单击事件。这将广播一个新事件,您可以侦听该事件:

myApp.directive('dropdownListener', function ($window, $rootScope) {
    return {
        restrict: 'A',

        link: function(scope, element, attr) {
          var w = angular.element($window);

          w.bind('click', function(){
            $rootScope.$broadcast('dropdown:close');
          });
        }
    }
});
这意味着您可以通过包含侦听器
下拉列表:close
事件来修改原始操作:

$scope.$on('dropdown:close', function (event, data) {
   $scope.$apply(function() {
      if($scope.open) { //only close when it is open
        $scope.open = !$scope.open;
      }
    });
});
$scope.$on('dropdown:close', function (event, data) {
   $scope.$apply(function() {
      if($scope.open) { //only close when it is open
        $scope.open = !$scope.open;
      }
    });
});