【问题标题】:Ignore ng-click when opening dropdown打开下拉菜单时忽略 ng-click
【发布时间】:2016-08-31 09:25:41
【问题描述】:

我有一个带有选项的列表,我用ng-options 循环到一个选择中。然后,当我单击其中一个选项时,我想调用一个函数。我先用ng-change 尝试过,但我遇到的问题是,当我连续两次单击同一个选项时,我无法检测到更改,所以它只是在我第一次单击时调用该函数它。比我用ng-click 试过的。现在的问题是,当我打开下拉菜单时,它也会检测到点击。所以它也调用函数。有没有办法,当我打开下拉菜单并在点击选项时检测它时忽略点击?我还尝试在我的函数中将$event 作为参数并在那里检查是否单击了该选项,但我没有找到解决方案。这是我的代码:

<select ng-options="option as option.name for option in myOptionsList" ng-model="currentOption" ng-click="myFunction($event)"></select>

我的清单:

myOptionsList = [
    {id: 1, name: 'Option 1'},
    {id: 2, name: 'Option 2'},
    {id: 3, name: 'Option 3'}
];

我的功能:

myFunction(event) {
    console.log(event);
    console.log('Print this if only option was clicked!');
}

任何想法如何在我打开下拉列表时忽略ng-click,并在单击option 时检测它,或者当再次单击选定的option 时如何检测ng-change?谢谢。

================================================ =========================

编辑 - 示例: 我有一个窗口,我可以在其中过滤列表。这个窗口我在我的选择中打开一个选项。所以当我打开选择时,它会打开窗口。现在想象一下,我设置了一些过滤条件,关闭窗口,我的列表现在被过滤了。打开过滤器的选项仍处于选中状态。现在我明白了,我必须稍微更改我的过滤条件,所以我再次打开下拉列表,然后再次单击选项以打开窗口,但 id 不起作用,因为它仍然处于选中状态并且 ng-更改未检测到选择中的任何更改。我该如何强制:

angular.module("myApp", []).controller("myController", function($scope) {
  $scope.currentOption;
  $scope.showWindow = false;

  $scope.myOptions = [{
    id: 1,
    name: 'This opens the window'
  }, {
    id: 2,
    name: 'Option 2'
  }, {
    id: 3,
    name: 'Option 3'
  }];

  $scope.showOption = function() {
    if ($scope.currentOption.id == 1) {
      $scope.showWindow = true;
    }
    console.log($scope.currentOption);
  }

  $scope.closeWindow = function() {
    $scope.showWindow = false;
  }
});
.filterWindow {
  width: 100px;
  height: 100px;
  background-color: rgba(50, 50, 50, 0.5);
  z-index: 100;
  margin-top: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="myApp" ng-controller="myController">
  <select ng-options="option as option.name for option in myOptions" ng-change="showOption()" ng-model="currentOption"></select>

  <div ng-if="showWindow" class="filterWindow">
    <button ng-click="closeWindow()">Close</button>
    Some filter criterias...
  </div>
</div>

再次感谢

【问题讨论】:

    标签: html angularjs html-select angularjs-ng-click angularjs-ng-change


    【解决方案1】:

    改用这个:

    <select ng-options="option as option.name for option in myOptionsList" 
           ng-model="selectedItem" ng-change="update()">
    </select>
    

    控制器

    $scope.myOptionsList = [
        {id: 1, name: 'Option 1'},
        {id: 2, name: 'Option 2'},
        {id: 3, name: 'Option 3'}
    ];
      $scope.update = function() {
        console.log($scope.selectedItem)
      }
    

    这里是工作 JS FIDDLE 链接:http://jsfiddle.net/jazibbashir/G8S32/1855/

    ================================================ =============================

    新需求解决方案

    只需将 ng-change 替换为 ng-click。

    angular.module("myApp", []).controller("myController", function($scope) {
      $scope.currentOption;
      $scope.showWindow = false;
    
      $scope.myOptions = [{
        id: 1,
        name: 'This opens the window'
      }, {
        id: 2,
        name: 'Option 2'
      }, {
        id: 3,
        name: 'Option 3'
      }];
    
      $scope.showOption = function() {
        if ($scope.currentOption.id == 1) {
          $scope.showWindow = true;
        }
        console.log($scope.currentOption);
      }
    
      $scope.closeWindow = function() {
        $scope.showWindow = false;
      }
    });
    .filterWindow {
      width: 100px;
      height: 100px;
      background-color: rgba(50, 50, 50, 0.5);
      z-index: 100;
      margin-top: 20px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    
    <div ng-app="myApp" ng-controller="myController">
      <select ng-options="option as option.name for option in myOptions" ng-click="showOption()" ng-model="currentOption"></select>
    
      <div ng-if="showWindow" class="filterWindow">
        <button ng-click="closeWindow()">Close</button>
        Some filter criterias...
      </div>
    </div>

    【讨论】:

    • 嗨,但这似乎不像我想要的那样工作......打开你的控制台,而不是打开选择选择'选项1',它将被打印......然后再次打开控制台并再次选择'选项1',它已经被选中......什么也没有发生并且没有调用函数?但是当我在同一选项上连续单击两次时,我也想调用该函数...
    • 无法产生您的问题,一切都在我最后完美运行,请查看这个小提琴:jsfiddle.net/jazibbashir/G8S32/1855 或者如果您想要双击而不是定义在双击时触发功能的角度指令。如果您只需要与双击指令等相关的帮助,请告诉我。
    • 嗨,请看我的编辑(带有代码sn-p的示例)并阅读它的描述......这就是我想做的......你可以在那里模拟它...我希望现在已经足够清楚了.. :) 谢谢
    • @MrBuggy 感谢您的解释。我根据您的要求更新了我的答案。
    【解决方案2】:

    我们可以通过一些小技巧来实现这一点。

    jsfiddle 上的示例。

    var myApp = angular.module('myApp', []);
    
    function MyCtrl($scope) {
      $scope.myOptionsList = [{
        id: 1,
        name: 'Option 1'
      }, {
        id: 2,
        name: 'Option 2'
      }, {
        id: 3,
        name: 'Option 3'
      }];
      $scope.update = function($event) {
        if ($event.screenX == 0)
          console.log('click on OPTION');
        else
          console.log('click on SELECT');
      }
    }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="myApp" ng-controller="MyCtrl">
      <select ng-options="option as option.name for option in myOptionsList" ng-model="selectedItem" ng-click="update($event)">
      </select>
      {{selectedItem.id}} {{selectedItem.name}}
    </div>

    【讨论】:

    • screenX 实际上是做什么的?干杯
    • 测试的时候发现如果ng-click事件发生在上,鼠标光标screenX坐标设置为0.
    • 嗨,我也在 IE 中测试过,控制台中总是有“单击 SELECT”(当我单击一个选项时也是如此)。所以这个解决方案不适用于每个浏览器......但是谢谢......
    • 无论如何,原生事件onclick 上不起作用。我不认为angular 可以跨浏览器。
    • Angular 支持:=> Opera 15+ => Internet Explorer:9+ => Firefox、Safari 和 Google Chrome
    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 2023-03-23
    • 2023-03-09
    • 1970-01-01
    • 2020-05-16
    • 2019-12-24
    相关资源
    最近更新 更多