ui-bootstrap datepicker:强制重新渲染一个datepicker?

时间:2015-05-06 15:10:08

标签: javascript angularjs angular-ui-bootstrap

具体使用ui-bootstrap的datepicker和NO jQuery ......

所以,我正在尝试将两个日期选择器中的日期范围选择器缝合在一起并且它非常接近。我正在尝试根据结束日历上选择的日期禁用开始日历上的日期,反之亦然。问题是,当在该日历上进行选择时,开始日历仅刷新或重新呈现。因此,如果我在结束日历上选择日期,则开始日历将不会重新运行禁用日期功能并重新渲染,直到我再次在开始日历上选择日期。

是否有人知道如何强制重新呈现日历或直接调用提供的禁用日期或自定义类函数?

3 个答案:

答案 0 :(得分:3)

我并不是100%确定这是你正在寻找的,没有任何代码可以作为答案,但希望这会给你一个如何完成你想要的提示。

Plunker Demo

因此,如果您想创建一个非常简单的日期范围选择器,您可以利用min-date属性,该属性指向可绑定表达式。这意味着每当父范围属性更改时,datepicker的相应隔离范围属性也会更改,反之亦然。因此,如果将“结束日期”datepicker的min-date属性绑定到“开始日期”datepicker的模型,则每当更改开始日期时,将更新第二个datepicker以反映更改。

<datepicker ng-model="startdt" show-weeks="false"></datepicker>
<datepicker ng-model="enddt" min-date="startdt" show-weeks="false"></datepicker>

为了让用户更好一些,您可以进一步观看开始日期,并在所选开始日期大于当前所选结束日期的情况下自动更新结束日期。

$scope.$watch('startdt', function(newval){
  if (newval > $scope.enddt) {
    $scope.enddt = newval;
  }
});

为了进一步提高可用性,如果您使用的是UI Bootstrap 0.13.0 +,则可以使用custom-class属性在日期范围内设置自定义CSS类。作为一个例子,你可以添加:

标记

//Bind the custom-class attribute to the setRangeClass function
<datepicker ng-model="enddt" min-date="startdt" custom-class="setRangeClass(date, mode)" show-weeks="false"></datepicker>

控制器

  //Define the setRangeClass on the controller
  $scope.setRangeClass = function(date, mode) {
    if (mode === 'day') {
      var dayToCheck = new Date(date).setHours(0,0,0,0);
      var startDay = new Date($scope.startdt).setHours(0,0,0,0);
      var endDay = new Date($scope.enddt).setHours(0,0,0,0);

      if (dayToCheck >= startDay && dayToCheck < endDay) {
        return 'range';
      }
    }
    return '';
  };

CSS

  /*Create the corresponding .range class*/
  .range>.btn-default {
    background-color: #5bb75b;
  }
  .range button span {
    color: #fff;
    font-weight: bold;
  }

答案 1 :(得分:1)

如果我理解正确,你会遇到类似的问题。我的getDayClass方法依赖于从服务器加载的信息。因此,当窗口小部件呈现它不可用时,因此当我从服务器接收查找数据时需要重新呈现。

<datepicker ng-model="selectedDate" 
            min-date="minDate" 
            show-weeks="false" 
            custom-class="getDayClass(date, mode)">
</datepicker>

我的小部件呈现,然后在服务器的响应之后,我触发重新呈现组件以更新样式。要触发重新呈现,我发现我可以只更新selectedDate对象:

$scope.selectedDate = new Date($scope.selectedDate.getTime() + 1);

不可否认,这有点像黑客攻击,但现在似乎有效。

答案 2 :(得分:-1)

如果您正在使用jquery datepicker,则可以使用beforeShowDay函数。对于我们的一个项目,我们使用它如下:

    beforeShowDay: function(date) {
        var dateStr = formatDate(date);
        var indexOfDate = $.inArray(dateStr, goldCalendarDateSource);
        if (indexOfDate != -1) {
            var tooltip = decodeStr(goldEventTooltipsArray[indexOfDate]);
            return [true, 'highlight', tooltip]; //[0]= isSelectable, 1= cssClass, [2]=Some tooltip text
        }
        return [false, '', '']
    },

goldCalendarDateSource是一个日期数组。我们正在强调一些使用该数组。正如js注释所解释的那样,您可以按以下顺序提供参数:[isEnabled,additionalCssClass,tooltipText]。 jQuery正在读取该数组...