在angularjs中禁用特定的单个日期和多个日期(仅限datePicker而不是dateTimePicker)

时间:2016-03-08 16:39:51

标签: angularjs datepicker

我想在AngularJS的日期选择器中禁用特定日期。

我使用AngularJS-bootstrap css作为组件(angular指令)。(ui.bootstrap.datepicker)

我使用以下代码:

datePicker.html:             

          <title>Typehead</title>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1">
          <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
              <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
            <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular-animate.js"></script>
            <script src="./ui-bootstrap-tpls-1.2.1.min.js"></script>
          <script src="./datePicker.js"></script>






        </head>

        <body ng-app="ui.bootstrap.demo" >

        <style>
          .full button span {
            background-color: limegreen;
            border-radius: 32px;
            color: black;
          }
          .partially button span {
            background-color: orange;
            border-radius: 32px;
            color: black;
          }
        </style>
        <div ng-controller="DatepickerDemoCtrl">
            <pre>Selected date is: <em>{{dt | date:'fullDate' }}</em></pre>

            <h4>Inline</h4>
            <div style="display:inline-block; min-height:290px;">
              <uib-datepicker ng-model="dt" class="well well-sm" datepicker-options="inlineOptions" ></uib-datepicker>
            </div>

            <h4>Popup</h4>
            <div class="row">
              <div class="col-md-6">
                <p class="input-group">
                  <input type="text" class="form-control"  uib-datepicker-popup="{{format}}" ng-model="dt" is-open="popup1.opened" datepicker-options="dateOptions" ng-required="true" close-text="Close" alt-input-formats="altInputFormats"  />
                  <span class="input-group-btn">
                    <button type="button" class="btn btn-default" ng-click="open1()"><i class="glyphicon glyphicon-calendar"></i></button>
                  </span>
                </p>
              </div>

                 <div class="col-md-6">
                <p class="input-group">
                  <input type="text" class="form-control" uib-datepicker-popup="{{format}}" ng-model="dt" is-open="popup3.opened" datepicker-options="dateOptions" ng-required="true" close-text="Close" alt-input-formats="altInputFormats" />
                  <span class="input-group-btn">
                    <button type="button" class="btn btn-default" ng-click="open3()"><i class="glyphicon glyphicon-calendar"></i></button>
                  </span>
                </p>
              </div>

              <div class="col-md-6">
                <p class="input-group">
                  <input type="text" class="form-control" uib-datepicker-popup ng-model="dt" is-open="popup2.opened" datepicker-options="dateOptions" ng-required="true" close-text="Close" />
                  <span class="input-group-btn">
                    <button type="button" class="btn btn-default" ng-click="open2()"><i class="glyphicon glyphicon-calendar"></i></button>
                  </span>
                </p>
              </div>
            </div>
            <div class="row">
              <div class="col-md-6">
                <label>Format: <span class="muted-text">(manual alternate <em>{{altInputFormats[0]}}</em>)</span></label> <select class="form-control" ng-model="format" ng-options="f for f in formats"><option></option></select>
              </div>
            </div>

            <hr />
            <button type="button" class="btn btn-sm btn-info" ng-click="today()">Today</button>
            <button type="button" class="btn btn-sm btn-default" ng-click="setDate(2009, 7, 24)">2009-08-24</button>
            <button type="button" class="btn btn-sm btn-danger" ng-click="clear()">Clear</button>
            <button type="button" class="btn btn-sm btn-default" ng-click="toggleMin()" uib-tooltip="After today restriction">Min date</button>
        </div>



        </body>

datePicker.js:

            var myApp= angular.module('ui.bootstrap.demo', ['ngAnimate', 'ui.bootstrap', 'ui.bootstrap.dateparser', 'ui.bootstrap.datepicker']);



             myApp.controller('DatepickerDemoCtrl', function($scope, $http) {



            $scope.today = function() {
                $scope.dt = new Date();
              };
              $scope.today();

              $scope.clear = function() {
                $scope.dt = null;
              };

              $scope.inlineOptions = {
                customClass: getDayClass,
                minDate: new Date(),
                showWeeks: false
              };

              $scope.dateOptions = {
                dateDisabled: disabled,
                formatYear: 'yy',
                maxDate: new Date(2020, 5, 22),
                minDate: new Date(),
                startingDay: 1
              };

              // Disable weekend selection
              function disabled(data) {
                var date = data.date,
                  mode = data.mode;
                return mode === 'day' && (date.getDay() === 0 || date.getDay() === 6);
              }

              $scope.toggleMin = function() {
                $scope.inlineOptions.minDate = $scope.inlineOptions.minDate ? null : new Date();
                $scope.dateOptions.minDate = $scope.inlineOptions.minDate;
              };

              $scope.toggleMin();

              $scope.open1 = function() {
                $scope.popup1.opened = true;
              };

              $scope.open2 = function() {
                $scope.popup2.opened = true;
              };

                $scope.open3 = function() {
                $scope.popup3.opened = true;
              };

              $scope.setDate = function(year, month, day) {
                $scope.dt = new Date(year, month, day);
              };

              $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];
              $scope.format = $scope.formats[0];
              $scope.altInputFormats = ['M!/d!/yyyy'];

              $scope.popup1 = {
                opened: false
              };

              $scope.popup2 = {
                opened: false
              };

              $scope.popup3 = {
                opened: false
              };

              var tomorrow = new Date();
              tomorrow.setDate(tomorrow.getDate() + 1);
              var afterTomorrow = new Date();
              afterTomorrow.setDate(tomorrow.getDate() + 1);
              $scope.events = [
                {
                  date: tomorrow,
                  status: 'full'
                },
                {
                  date: afterTomorrow,
                  status: 'partially'
                }
              ];

              function getDayClass(data) {
                var date = data.date,
                  mode = data.mode;
                if (mode === 'day') {
                  var dayToCheck = new Date(date).setHours(0,0,0,0);

                  for (var i = 0; i < $scope.events.length; i++) {
                    var currentDay = new Date($scope.events[i].date).setHours(0,0,0,0);

                    if (dayToCheck === currentDay) {
                      return $scope.events[i].status;
                    }
                  }
                }

                return '';
              }



             });

文档给了我: dateDisabled(date,mode) - 一个可选表达式,用于根据传递日期和当前模式禁用可见选项。

我尝试了很长时间并且很难使用它但浪费了5个小时。我确定解决方案很简单。任何人都可以提供以下帮助:

1.如何使用它来禁用单个日期 2.从数组传递的多个日期!

任何有关工作示例的帮助都将不胜感激!

1 个答案:

答案 0 :(得分:6)

将date-disabled属性链接到一个在您的范围内接受两个参数的函数,如下所示:

@OnClick(R.id.loadListOrMapButton)
public void onClickChangeView() {
     // check for null and all that jazz

     if (mapsFragment.mapIsReady()) {
          // updateDisplay and everything
     } else {
         // make a toast or something asking them to try later.
     } 
}

将为日历上的所有可见日期调用该函数。因此,您需要检查要禁用的日期的日期。例如,下面的函数将禁用日期: 2016年3月14日,2016年3月15日和2016年3月16日

<input type="text" class="form-control"  uib-datepicker-popup="{{format}}" date-disabled="disabled(date, mode)" /> <!-- Other attributes deleted for clarity -->

<强>更新

要更改特定日期的类,请使用custom-class属性:

$scope.disabled = function(date, mode){

            var holidays = [
              new Date(2016,2,14),
              new Date(2016,2,15),
              new Date(2016,2,16),
            ]

            var isHoliday = false;
            for(var i = 0; i < holidays.length ; i++) {
              if(areDatesEqual(holidays[i], date)){
                isHoliday = true;
              }
            }

            return ( mode === 'day' && isHoliday );
          };

          function areDatesEqual(date1, date2) {

            return date1.setHours(0,0,0,0) === date2.setHours(0,0,0,0)

          }

将为所有可见日期调用 dayClass 函数,并返回要添加到该元素的css类。例如,下面的函数会将类约会添加到约会数组中的日期

<input type="text" class="form-control"  uib-datepicker-popup="{{format}}" date-disabled="disabled(date, mode)" custom-class="dayClass(date, mode)"/>

然后你需要添加一些样式,如下所示:

$scope.dayClass = function(date, mode) {

            var appointments = [
              new Date(2016,2,3),
              new Date(2016,2,8),
              new Date(2016,2,22),
            ]

            if (mode === 'day') {

              var dateToCheck = new Date(date);

              for(var i = 0; i < appointments.length ; i++) {
                if(areDatesEqual(appointments[i], dateToCheck)){
                  return 'appointment';
                }
              }
            }
            return '';
          }

更新2

要执行特定日期的操作,您可以使用 ng-change 并按照与以前相同的方法,它可能是这样的:

.appointment>button {
  color: white;
  background-color: red;
}

在您的控制器上:

<input type="text" class="form-control" uib-datepicker-popup="{{format}}" ng-model="dt" ng-change="dateSelected()" /> <!-- Other attributes deleted for clarity -->

这里有一个完整的例子:

$scope.dateSelected = function(){

var appointments = [
  new Date(2016,2,3),
  new Date(2016,2,8),
  new Date(2016,2,22),
];

var dateSelected = new Date($scope.dt);

for(var i = 0; i < appointments.length ; i++) {
  if(areDatesEqual(appointments[i], dateSelected)){
    performAction();
  }
}

};

function performAction(){
  alert("Appointment date selected");
}
var myApp= angular.module('ui.bootstrap.demo', ['ngAnimate', 'ui.bootstrap', 'ui.bootstrap.dateparser', 'ui.bootstrap.datepicker']);



             myApp.controller('DatepickerDemoCtrl', function($scope, $http) {



            $scope.today = function() {
                $scope.dt = new Date();
              };
              $scope.today();

              $scope.clear = function() {
                $scope.dt = null;
              };

              $scope.inlineOptions = {
                minDate: new Date(),
                showWeeks: false
              };

              $scope.dateOptions = {
                  formatYear: 'yy',
                  maxDate: new Date(2020, 5, 22),
                  minDate: new Date(),
                  startingDay: 1
                };

                // Disable weekend selection
                function disabledasda(data) {
                  var date = data.date,
                    mode = data.mode;
                  return mode === 'day' && (date.getDay() === 0 || date.getDay() === 6);
                }

              $scope.toggleMin = function() {
                $scope.inlineOptions.minDate = $scope.inlineOptions.minDate ? null : new Date();
                $scope.dateOptions.minDate = $scope.inlineOptions.minDate;
              };

              $scope.toggleMin();

              $scope.open1 = function() {
                $scope.popup1.opened = true;
              };


              $scope.setDate = function(year, month, day) {
                $scope.dt = new Date(year, month, day);
              };

              $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];
              $scope.format = $scope.formats[0];
              $scope.altInputFormats = ['M!/d!/yyyy'];

              $scope.popup1 = {
                opened: false
              };


              var today = new Date();
               
              $scope.holidays = [
                  new Date(today.getFullYear(),today.getMonth(),14),
                  new Date(today.getFullYear(),today.getMonth(),15),
                  new Date(today.getFullYear(),today.getMonth(),16),
              ]
              
              $scope.appointments = [
                  new Date(today.getFullYear(),today.getMonth(),3),
                  new Date(today.getFullYear(),today.getMonth(),7),
                  new Date(today.getFullYear(),today.getMonth(),20),
              ]
              $scope.disabled = function(date, mode){
              
                var isHoliday = false;
                for(var i = 0; i < $scope.holidays.length ; i++) {
                  if(areDatesEqual($scope.holidays[i], date)){
                    isHoliday = true;
                  }
                }

                return ( mode === 'day' && isHoliday );
              };

              function areDatesEqual(date1, date2) {

                return date1.setHours(0,0,0,0) === date2.setHours(0,0,0,0)

              }

              $scope.dayClass = function(date, mode) {

            if (mode === 'day') {

              var dateToCheck = new Date(date);

              for(var i = 0; i < $scope.appointments.length ; i++) {
                if(areDatesEqual($scope.appointments[i], dateToCheck)){
                  return 'appointment';
                }
              }
            }
            return '';
          };

          $scope.dateSelected = function(){



    var dateSelected = new Date($scope.dt);

    for(var i = 0; i < $scope.appointments.length ; i++) {
      if(areDatesEqual($scope.appointments[i], dateSelected)){
        performAction();
      }
    }

  };

  function performAction(){
    alert("Appointment date selected");
  }



             });