【问题标题】:Disable past Time angular bootstrap datetimepicker禁用过去时间角度引导 datetimepicker
【发布时间】:2016-03-02 00:53:11
【问题描述】:

我正在使用角度引导日期时间选择器。我想为过去的日期和时间制作$dates.selectable = false

我该怎么做?

如果您需要代码示例,请告诉我。

【问题讨论】:

标签: angularjs datetimepicker angular-bootstrap


【解决方案1】:

我假设您使用的是angular-bootstrap-datetimepicker,因此您需要使用before-render callback

代码如下所示:

function BeforeRender ($dates) {
  var activeDate = moment();

  $dates.filter(function (date) {
    return date.localDateValue() >= activeDate.valueOf()
  }).forEach(function (date) {
    date.selectable = false;
  })
}

自述文件有一个example of a date range picker,可以满足您的需求。

【讨论】:

  • 要禁用过去的日期,return date.localDateValue() <= activeDate.valueOf()。但这也会禁用当前日期。我希望用户输入当前日期而不是过去的时间。就像当前时间是14 July 2:30 pm,用户可以选择 7 月 14 日,但不能选择下午 2:30 之前的时间。您能否更新答案以涵盖这种情况。
  • @PrashantPrabhakarSingh 我也介绍了您的情况。 stackoverflow.com/a/61452476/9614476
【解决方案2】:

正如您在其网站上看到的(https://angular-ui.github.io/bootstrap/#/datepicker),您可以通过您的配置对象传递“dateDisabled”。

这是示例的html:

<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 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>

这是 JavaScript:

angular.module('ui.bootstrap.demo').controller('DatepickerDemoCtrl', function ($scope) {
  $scope.today = function() {
    $scope.dt = new Date();
  };
  $scope.today();

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

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

  $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.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
  };

  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: disabled,

通过在您的配置对象中传递它,您可以将函数 disabled 设置为禁用日期的处理程序。所以几行之后你就可以阅读禁用的功能:

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

函数的两个参数是:

  • 日期
  • 模式

date 是一个普通的 JavaScript 日期对象,您可以为此使用所有 date methods

mode 是日期模式,如您在此示例中所见,您验证 mode 是否等于“day”。

因此,您可以通过这种方式简单地禁用一系列日期或自定义日期。

【讨论】:

  • 我认为这个问题与 angular-ui 日期选择器无关
【解决方案3】:

你可以尝试插入

startDate:"-0m",

此代码禁用过去所有不可点击的日期。

【讨论】:

    【解决方案4】:

    我最近遇到了这个问题,在阅读了一些stackoverflow答案后,我想出了这个代码:

    这也处理日、时和分。

        $scope.startDateBeforeRender = function($view, $dates, $leftDate, $upDate, $rightDate) {
            const minDate = moment().local().startOf($view).valueOf();
            for(let i=0; i < $dates.length; i++) {
                if($view === 'day' || $view === 'hour') {
                    if (minDate > $dates[i].localDateValue()) {
                        $dates[i].selectable = false;
                    }
                } else {
                    if (minDate >= $dates[i].localDateValue()) {
                        $dates[i].selectable = false;
                    }
                }
            }
        };
    

    HTML 为:

    <md-input-container class="md-block" flex-gt-sm>
        <label>Time</label>
        <div class="dropdown">
            <a class="dropdown-toggle" id="dropdown2" role="button" data-toggle="dropdown" data-target="#" href="javascript:void(0);">
                <div class="input-group">
                    <input type="text" class="form-control" data-ng-model="data.dateDropDownInput"><span class="input-group-addon"><i class="glyphicon glyphicon-calendar"></i></span>
                </div>
            </a>
            <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
                <datetimepicker data-ng-model="data.dateDropDownInput" data-before-render="startDateBeforeRender($view, $dates, $leftDate, $upDate, $rightDate)" data-datetimepicker-config="{ dropdownSelector: '#dropdown2' }"/>
            </ul>
        </div>
    </md-input-container>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2017-11-19
      • 2015-01-30
      • 1970-01-01
      • 2015-02-11
      • 2016-01-17
      相关资源
      最近更新 更多