JSFiddle - React, Tailwind, and code Playground
HTML
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.8/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.6.0/moment-with-langs.min.js"></script>
<div class="container" ng-app="app" ng-controller="MainCtrl">
<header>
<div class="page-header">
<h2>バインディングに連動したフォームの検証<small>(日付ピッカー)</small></h2>
</div>
</header>
<section>
<form name="form" class="form-horizontal">
<!-- HTML5バージョン -->
<div class="form-group" ng-class="{'has-error':!form.date.$valid}">
<label for="diDate1" class="col-sm-4 control-label">日付(HTML5)</label>
<div class="col-sm-4">
<!-- type="date"に注意。これはHTML5タグ。FFではいまいちなサポートだが動かないことはない。 https://docs.angularjs.org/api/ng/input/input%5Bdate%5D -->
<!-- ng-model="date"の初期値設定はapp.jsで行っている。 -->
<!-- minとmaxでvalidになる期間を指定。値の設定はapp.jsで行っている。 -->
<!-- 「| date:'yyyy-MM-dd'」はdateオブジェクトをyyy-MM-ddのフォーマットで出力するためのフィルタ指定。 https://docs.angularjs.org/api/ng/filter/date -->
<!-- requiredでnullチェックも同時に行っている。 -->
<input id="diDate1" type="date" class="form-control" placeholder="yyyy-MM-dd(今日から1年後まで)" ng-model="date" name="date" required min="{{minDate | date:'yyyy-MM-dd'}}" max="{{maxDate | date:'yyyy-MM-dd'}}" />
</div>
</div>
<!-- datetimepickerバージョン -->
<div class="form-group" ng-class="{'has-error':!form.date.$valid}">
<label for="diDate2" class="col-sm-4 control-label">日付(datetimepicker)</label>
<div class="col-sm-4">
...
CSS
/**
* @license angular-bootstrap-datetimepicker v0.2.2
* (c) 2013 Knight Rider Consulting, Inc. http://www.knightrider.com
* License: MIT
*/
.datetimepicker {
padding:4px;
margin-top:1px;
-webkit-border-radius:4px;
-moz-border-radius:4px;
border-radius:4px;
direction:ltr
}
.datetimepicker-inline {
width:220px
}
.datetimepicker.datetimepicker-rtl {
direction:rtl
}
.datetimepicker.datetimepicker-rtl table tr td span {
float:right
}
.datetimepicker-dropdown, .datetimepicker-dropdown-left {
top:0;
left:0
}
[class*=" datetimepicker-dropdown"]:before {
content:'';
display:inline-block;
border-left:7px solid transparent;
border-right:7px solid transparent;
border-bottom:7px solid #ccc;
border-bottom-color:rgba(0, 0, 0, 0.2);
position:absolute
}
[class*=" datetimepicker-dropdown"]:after {
content:'';
display:inline-block;
border-left:6px solid transparent;
border-right:6px solid transparent;
border-bottom:6px solid #fff;
position:absolute
}
[class*=" datetimepicker-dropdown-top"]:before {
content:'';
display:inline-block;
border-left:7px solid transparent;
border-right:7px solid transparent;
border-top:7px solid #ccc;
border-top-color:rgba(0, 0, 0, 0.2);
border-bottom:0
}
[class*=" datetimepicker-dropdown-top"]:after {
content:'';
display:inline-block;
border-left:6px solid transparent;
border-right:6px solid transparent;
border-top:6px solid #fff;
border-bottom:0
}
.datetimepicker-dropdown-bottom-left:before {
top:-7px;
right:6px
}
.datetimepicker-dropdown-bottom-left:after {
top:-6px;
right:7px
}
.datetimepicker-dropdown-bottom-right:before {
top:-7px;
left:6px
}
.datetimepicker-dropdown-bottom-right:after {
top:-6px;
left:7px
}
.datetimepicker-dropdown-top-left:before {
bottom:-7px;
right:6px
}
.datetimepicker-dropdown-top-left:after {
bottom:-6px;
...
JavaScript
// appというAngularJSアプリケーションモジュールを作成
// datetimepickerモジュールを組み込み
var app = angular.module('app', ['ui.bootstrap.datetimepicker']);
// アプリケーションモジュールにMainCtrlというコントローラーを追加
app.controller('MainCtrl', function ($scope) {
//初期選択の日付を今日の日付に設定
$scope.date = new Date();
//期間の最小を今日の日付に設定
$scope.minDate = new Date();
//期間の最大を今日の日付から1年後に設定
var maxDate = new Date();
maxDate.setFullYear(maxDate.getFullYear() + 1);
$scope.maxDate = maxDate;
//日付ピッカー選択時に呼ばれる
$scope.onTimeSet = function (newDate, oldDate) {
console.log(newDate);
console.log(oldDate);
}
//カレンダーの表示を日本語にする
moment.lang('ja');
});
/**
* @license angular-bootstrap-datetimepicker v0.2.2
* (c) 2013 Knight Rider Consulting, Inc. http://www.knightrider.com
* License: MIT
* @author Dale "Ducky" Lotts
* @since 2013-Jul-8
*/
angular.module('ui.bootstrap.datetimepicker', []).constant('dateTimePickerConfig', {
dropdownSelector: null,
minuteStep: 5,
minView: 'minute',
startView: 'day',
weekStart: 0
}).constant('dateTimePickerConfigValidation', function (configuration) {
"use strict";
var validOptions = ['startView', 'minView', 'minuteStep', 'dropdownSelector', 'weekStart'];
for (var prop in configuration) {
if (configuration.hasOwnProperty(prop)) {
if (validOptions.indexOf(prop) < 0) {
throw ("invalid option: " + prop);
}
}
}
var validViews = ['minute', 'hour', 'day', 'month', 'year'];
if (validViews.indexOf(configuration.startView) < 0) {
throw ("invalid startView value: " + configuration.startView);
}
if (validViews.indexOf(configuration.minView) < 0) {
throw ("invalid minView value: " + configuration.minView);
}
if (validViews.indexOf(configuration.minView) > validViews.indexOf(configuration.startView)) {
throw ("startView must be greater than minView");
}
if...