javascript - 在外部单击时,Angular 隐藏 jQuery DatePicker

标签 javascript angularjs datepicker

我在一个 Angular 项目中使用 jQuery datepicker。

<div>
  <!-- Anchor that toggles date picker -->
  <a class="datepicker button dropdown" ng-click="ctrl.showHideDatePicker">
    <span>Choose a date</span>
  </a>

  <!-- Date picker -->
  <div ui-date="options" ng-show="ctrl.showDatePicker"></div>
</div>

问题:日期选择器将保持打开状态,直到我选择日期或再次单击 anchor 标记。

所需结果:我希望通过单击日期选择器本身之外的任何内容来关闭日期选择器。

最佳答案

您可以向正文添加单击事件并检查目标元素是否是日期选择器。如果不是,则隐藏日期选择器。

不太理想,因为它使用了一些 jQuery,但不幸的是 jQuery UI 日期选择器没有附带 onBlur 事件。

var app = angular.module("app", ["ui.date"]);

app.controller("controller", function() {
  var vm = this;

  vm.showDatePicker = false;

  vm.options = {
    changeYear: true,
    changeMonth: true,
    yearRange: '1900:-0'
  };

  vm.hideDatePickerOnBlur = function($event) {
    var $target = angular.element($event.target);

    // Target is the "Choose a date" link
    var isLink = $target.closest("#showDatePicker").length;
    // Target is in the datepicker
    var isDatePicker = $target.closest(".ui-datepicker").length;
    // Target is an element in the header of the datepicker (added this because isDatePicker was false when clicking either arrow even though they are descendants of the datepicker)
    var isHeader = $target.closest(".ui-datepicker-header").length;

    if (!isLink && !isDatePicker && !isHeader) {
      vm.showDatePicker = false;
    }
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
<script src="https://rawgit.com/angular-ui/ui-date/master/dist/date.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css" rel="stylesheet">

<body ng-app="app" ng-controller="controller as ctrl" ng-click="ctrl.hideDatePickerOnBlur($event)">

  <div>
    <!-- Anchor that toggles date picker -->
    <a id="showDatePicker" class="datepicker button dropdown" ng-click="ctrl.showDatePicker = true">
      <span>Choose a date</span>
    </a>

    <!-- Date picker -->
    <div ui-date="options" ng-show="ctrl.showDatePicker"></div>
  </div>

</body>

关于javascript - 在外部单击时,Angular 隐藏 jQuery DatePicker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42845632/

相关文章:

javascript - Materialise datepicker - 单击图标时呈现

javascript - 无法根据 JSON API 变量更改 HTML 背景

javascript - 如何修复此代码以永远显示 10 秒并隐藏 10 秒?

angularjs - 当选定的 ng-option 更改时获取值

javascript - Twitter Bootstrap 的日历/日期和时间选择器

javascript - Angular UI-Grid - 当自定义指令更新单元格值时,afterCellEdit 事件不会触发

javascript - jQuery如何选择div中的所有元素

javascript - ReactJS - 事件未定义,它不会渲染 onChange 事件?

javascript - Angular js - 从方法外部返回和 console.log $http 响应

angularjs - 在 View 模板中实现 noUiSlider - AngularJS