【问题标题】:Bootstrap-ui datepicker close-on-date-selectionBootstrap-ui datepicker close-on-date-selection
【发布时间】:2015-09-04 13:33:25
【问题描述】:

技术: AngularJs 和 Bootstrap-ui

环境: 我使用由“FilterCtrl”控制的可协作过滤器部分。过滤器中的每个输入元素都由嵌套控制器控制,例如“TypeaheadCtrl”或“DatepickerCtrl”。每一个的 ng-model 都在 FilterCtrl 中绑定了“$parent.field”。

问题: Datepicker 工作正常,exept,这就是问题,它没有关闭。根据默认设置 (https://angular-ui.github.io/bootstrap/#/datepicker),日期选择器应在选择日期时关闭。它不是。即使我单击按钮栏的“关闭”按钮,它也不会。如果焦点发生变化,它会关闭。

HTML:

<div class="" ng-controller="FilterCtrl">
  <a class="black bold nodecoration" ng-click="isCollapsed = !isCollapsed" role="button">Filter</a>
<!-- Filter -->
  <div class="bckgrnd-lgrey bordered max-width" collapse="isCollapsed" id="findenFilter">
    <div class="nobreak" ng-controller="TypeaheadCtrl">
      <label>Suchbegriff:
        <input ng-model="$parent.searchText" placeholder="z.B. Rock" type="text" typeahead="prediction for prediction in predictions | filter:$viewValue |limitTo:8"></label>
    </div>
    <div class="nobreak" ng-controller="DatepickerCtrl">
      <label>Datum:
        <input class="" close-text="Close" datepicker-popup="{{format}}" is-open="status.opened" ng-click="open()" ng-model="$parent.selectedDate" show-weeks="false" type="text">
    </div>
    <div class="nobreak">
      <label>Land: </label>
    </div>

    <button type="button" name="button" ng-click="printValues()">log values</button>
  </div>

</div>

JS: DatepickerCtrl:

angular.module('tbdApp')
  .controller('DatepickerCtrl', function($scope) {
    this.awesomeThings = [
      'HTML5 Boilerplate',
      'AngularJS',
      'Karma'
    ];
    $scope.today = function() {
      $scope.selectedDate = new Date();
    };
    $scope.clear = function() {
      $scope.selectedDate = null;
    };
    $scope.open = function($event) {
      $scope.status.opened = true;
    };


    $scope.status = {
      opened: false
    };

    $scope.formats = ['dd.MM.yyyy', 'dd-MMMM-yyyy', 'yyyy/MM/dd'];
    $scope.format = $scope.formats[0];
    $scope.today();
  });

过滤控制:

angular.module('tbdApp')
  .controller('FilterCtrl', function ($scope) {
    this.awesomeThings = [
      'HTML5 Boilerplate',
      'AngularJS',
      'Karma'
    ];
    $scope.isCollapsed = false;
    $scope.selectedDate = null;
    $scope.searchText = null;
    $scope.printValues = function () {
      console.log("collapsed: " + $scope.isCollapsed);
      console.log("selectedDate: " + $scope.selectedDate);
      console.log("searchText: " + $scope.searchText);
    }
  });

我没有找到有类似问题的人。我想这可能是一个范围问题,但我不知道这个问题到底是什么。

【问题讨论】:

标签: angularjs datepicker angular-ui-bootstrap


【解决方案1】:

因此,根据您的 plunkr 示例,我发现的问题在于您输入的事件。而不是

ng-click="open()"

ng-focus="open()"

发生这种情况是因为在您选择日期后,angularjs 会尝试将点击事件移动到输入框中。不知道为什么,但这就是行为。

【讨论】:

  • 非常感谢。这解决了我的问题,但产生了另一个问题。它现在使用“关闭”按钮和 on-select-close 正确关闭日期选择器,但关闭后的焦点在输入框上,并且如果不点击某处然后再次点击输入框就不可能再次触发事件。您是否有针对此问题的智能且灵活的解决方案?有问题我不想改外国代码(迁移恐怖)github.com/angular-ui/bootstrap/blob/master/src/datepicker/…
  • 好吧,如果您查看他们在angular-ui.github.io/bootstrap 为日期选择器提供的演示,您描述的行为是默认行为。我假设在不更改库代码的情况下,您可以尝试查看将由日期选择更改的模型值,然后关注其他一些元素。但是,根据我的经验,我从不需要在选择日期后从输入中移除焦点。
  • 今天遇到了同样的问题。观察模型值并在目标输入上调用blur() 对我来说不是一个选项,因为切换月份也会触发焦点丢失,并且 datepicker 只会自行关闭。经过一番调查,我发现如果出现自动关闭选项 scope.$emit('hidePicker'); 正在执行,所以我可以在我的控制器上捕获它并使用 $scope.$on('hidePicker', function () { targetElement.blur() } 模糊输入。这解决了我的问题。
【解决方案2】:

智能灵活的解决方案:检查 open() 方法中的 $event.target。

HTML:

<div class="my-datepicker" ng-click="datePickers.open(0, $event)">
    <input type="text" ng-model="date_min" uib-datepicker-popup is-open="datePickers.opened[0]"/>
    <span class="glyphicon glyphicon-calendar"></span>
</div>
<div class="my-datepicker" ng-click="datePickers.open(1, $event)">
    <input type="text" ng-model="date_max" uib-datepicker-popup is-open="datePickers.opened[1]"/>
    <span class="glyphicon glyphicon-calendar"></span>
</div>

JS:

$scope.datePickers = {
    opened: [false, false],

    open: function (i, e) {
        if (!$(e.toElement).parent().hasClass('my-datepicker')) return;
        this.opened[i] = true;
    }
};

【讨论】:

  • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多