LoginSignup
24
24

More than 5 years have passed since last update.

AngularJS: UI Bootstrap の datepicker-popup の使い方

Last updated at Posted at 2014-12-06

UI Bootstrap の datepicker-popup は、クリックしたら Datepicker を表示するようにするためのディレクティブです。日付選択のためのカレンダーですね。

こんなやつです。

Screen Shot 2014-12-06 at 4.42.06 PM.png

まずはコード

以下のような感じで利用することができます。

<div class="input-group" ng-controller="DatePickerController">
  <input type="text"
          class="form-control"
          ng-model="date"
          datepicker-popup
          is-open="datePickerOpen">
  <div class="input-group-addon" ng-click="toggleDatePicker($event)">
    <i class="glyphicon glyphicon-calendar"></i>
  </div>
</div>
angular.module('datepicker-example', ['ui.bootstrap'])
.controller('DatePickerController', function($scope) {
  $scope.date = new Date();
  $scope.datePickerOpen = false;
  $scope.toggleDatePicker = function($event) {
    // これが重要!!!
    $event.stopPropagation();

    $scope.datePickerOpen = !$scope.datePickerOpen;
  };
});

動くコードは Plunker に上げてます。

ng-model

datepicker-popup を設定する要素には ng-model が必要です。Datepicker で選択した日付の Date オブジェクトが ng-model で指定したプロパティに入ってきます。

ポップアップの開閉

is-open に渡したフラグを on/off することで、datepicker の入ったポップアップを開閉します。

一番のハマりどころが、 クリックイベントのバブリングを止める必要がある ところ。

datepicker-popup は、ポップアップの外をクリックした際に閉じるようにするために、親の要素に click イベントが来るとポップアップを閉じてしまいます。$event.stopPropagation() をしないと、開閉のためのフラグが true になった直後に親要素のイベントハンドラによって false にされてしまい、ポップアップが開きません。確かに公式サイトの例にもそう書いてあるのですが、見落としていると全く意味がわからないので要注意です。

設定

HTML の属性でカスタマイズすることもできるのですが、アプリ全体で共通の設定は UI Bootstrap で提供されている設定オブジェクト(constant)を変更するのが楽です。

angular.module('datepikcer-example')
.config(function(datepickerConfig, datepickerPopupConfig) {
  angular.extend(datepickerConfig, {
    showWeeks: false,
    formatDay: 'd'
  });

  angular.extend(datepickerPopupConfig, {
    currentText: '今日',
    clearText: 'クリア',
    closeText: '閉じる'
  });
});

オプションの一覧は 公式ドキュメント にあります。

一つの要素で

上記の例ではポップアップを出す要素とクリックする要素が分かれていますが、一つの要素に統合することもできます。

Screen Shot 2014-12-06 at 4.49.43 PM.png

<div ng-controller="DatePickerController">
  <button type="text"
          class="btn btn-default"
          ng-model="date"
          datepicker-popup
          is-open="datePickerOpen"
          ng-click="toggleDatePicker($event)">
    {{date | date : 'yyyy年MM月dd日'}}
  </button>
</div>

ng-model って任意の要素に追加できるんですね。

スタイリング

ポップアップには datepicker-popup-wrap という属性がついているので、それを使うのが良さそうです。

例えば・・・

[datepicker-popup-wrap] {
  padding: 10px;
}
24
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
24