当前位置: 首页 > 面试题库 >

Angular jQuery Datepicker未在加载时设置MinDate

宇文金鑫
2023-03-14
问题内容

我在AngularJS项目的Date From和Date To字段上使用JQuery
UI的Datepicker。我添加了将值绑定到模型值的指令,还添加了对OnSelect的检查,该检查为每个字段设置minDate和maxDate选项(因此Date
To永远不会早于Date
From)。问题在于,在加载页面时,实际上没有选择任何日期(即使模型具有值),因此仍然可以选择早于“日期自”的“到”日期。我添加了$
watch服务以至少纠正该错误,但是我仍然不知道如何在指令内或控制器内在加载时设置minDate。我也在Angular代码之外尝试了$(document).ready,但这也不起作用。这是添加任何内容设置minDate之前的代码。

在控制器内:

$scope.messagesForm.dateFrom = moment().subtract('days', 30).format('MM/DD/YYYY');
$scope.messagesForm.dateTo = moment().format('MM/DD/YYYY');
$scope.$watch('messagesForm.dateTo', function(newVal, oldVal) {
    if (!newVal) return;
    if (Date.parse(newVal) < Date.parse($scope.messagesForm.dateFrom)) {
        $scope.messagesForm.dateFrom = newVal;
    }
});

指示:

.directive('datepicker', function() {
return {
    restrict: 'A',
    require : 'ngModel',
    link : function (scope, element, attrs, ngModelCtrl) {
        $(function(){
            element.datepicker({
                dateFormat: 'mm/dd/yy',
                showStatus: true,
                showWeeks: true,
                highlightWeek: true,
                maxDate: 0,
                numberOfMonths: 1,
                showAnim: "scale",
                showOptions: { origin: ["bottom", "right"] },
                onSelect: function (date) {
                    if (this.id === "MessageDateFrom") {
                       $("#MessageDateTo").datepicker("option", "minDate", date);
                    } else if (this.id === "MessageDateTo") {
                        $("#MessageDateFrom").datepicker("option", "maxDate", date);
                    }
                    ngModelCtrl.$setViewValue(date);
                    scope.$apply();
                }
            });
        });
    }
}

});

HTML:

<div class="form-group">
     <input type="text" id="MessageDateFrom" class="form-control dates" ng-model="messagesForm.dateFrom" datepicker readonly="readonly" />
</div>
<div class="form-group">
     <input type="text" id="MessageDateTo" class="form-control dates" ng-model="messagesForm.dateTo" datepicker readonly="readonly" />
</div>

我尝试失败的JQuery:

$(document).ready(function() {
    $("MessageDateTo").datepicker("option","minDate",$("MessageDateFrom").val());
};

有任何想法吗?

谢谢!


问题答案:

无需担心控制器加载的时间或仅添加这两个属性
minDate

maxDate的
限制,例如minDate:"-30d",maxDate: 0,

您还可以从指令属性动态放置minDate和maxDate值。

指示

app.directive('datepicker', function() {
    return {
        restrict: 'A',
        require : 'ngModel',
        link : function (scope, element, attrs, ngModelCtrl) {
            $(function(){
                element.datepicker({
                    dateFormat: 'mm/dd/yy',
                    showStatus: true,
                    showWeeks: true,
                    highlightWeek: true,
                    minDate:"-30d", //here i did logic -30d
                    maxDate: 0, //today is max date
                    numberOfMonths: 1,
                    showAnim: "scale",
                    showOptions: { origin: ["bottom", "right"] },
                    onSelect: function (date) {
                        ngModelCtrl.$setViewValue(date);
                        scope.$apply();
                    }
                });
            });
        }
    }
});

工作朋克

更新资料

抱歉,我的错误假设是,如果您真的很在意何时加载数据或在那个时候分配日期变量jquery ui datepicker应该绑定到它们,那么我attrs.$observe将更喜欢使用在评估属性表达式时将调用的方法。为了使其正常工作,我确实在页面上添加了一个属性名称loaded="{{messagesForm.dateFrom}}"loaded="{{messagesForm.dateTo}}",因此,每当将值分配给dateFrom和dateTo时,相应的datepicker都会分配给它们的元素

指示

 app.directive('datepicker', function() {
    return {
        restrict: 'A',
        require : 'ngModel',
        link : function (scope, element, attrs, ngModelCtrl) {
            //get called when `{{}}` value evaluated
            attrs.$observe('loaded',function(val){
              element.datepicker({
                  dateFormat: 'mm/dd/yy',
                  showStatus: true,
                  showWeeks: true,
                  highlightWeek: true,
                  maxDate: 0,
                  numberOfMonths: 1,
                  showAnim: "scale",
                  showOptions: { origin: ["bottom", "right"] },
                  onSelect: function (date) {
                      if (this.id === "MessageDateFrom") {
                         $("#MessageDateTo").datepicker("option", "minDate", date);
                      } else if (this.id === "MessageDateTo") {
                          $("#MessageDateFrom").datepicker("option", "maxDate", date);
                      }
                      ngModelCtrl.$setViewValue(date);
                      scope.$apply();
                  }
              });
            })

        }
    }
});

更新了Plunkr,
并在5秒钟后演示了范围变量的设置值。

希望这可以对您有所帮助,谢谢。



 类似资料:
  • 我想更改页面加载时的“选择组件”值。我读了相关的帖子,那里提出的每一个解决方案都适用于点击按钮。然而,我想要的是在页面加载后设置值,而不需要任何用户操作。我拥有的是: 以及: 我有相同的代码附加到按钮上,并且它可以工作。它只是不适用于准备()函数。所以我的问题是:如何在页面加载后设置选择值? 完整html

  • 因此,当我尝试使用FragmentStatePagerAdapter和Loader API但UI中没有设置值时,我的意思是当完成onLoadFinished()并将TextView、ImageView和changeCursor的值设置到我的适配器时,它并不反映它,我看到的是我在XML中设置的UI。 让我们看看我能不能把这个问题解释清楚。 我有一个列表,当一个项目是点击将得到一个详细的视图。当一个项

  • 你能帮我找出配置中缺少的步骤吗? 我正试图将logger添加到我非常简单的web应用程序中:为了做到这一点,我使用了log4j2 (beta9)。 我写下了我的<code>log4j2.xml<code>如下 我把它放在WEB-INF文件夹里。 然后,我有一个简单的servlet,它执行以下操作 正如你所看到的,这只是一个尝试,看看是否如预期的那样工作,但它没有。通过阅读此处的web app,我不

  • 当帧加载时,如何在日期选择器上显示焦点? 如何验证用户只能输入日期格式的文本字段和 如何在Swing中将焦点设置在jdatechooser图标上。 代码 private void jFormattedTextField1KeyPressed(java.awt.event.KeyEvent evt){ //TODO在此处添加处理代码:

  • 问题内容: 我想使用安装json2csv,但收到此错误: 有关如何在MacOS上解决此问题的任何帮助? 问题答案: [更新:从Go 1.8开始,默认为,但是如果您想了解布局,自定义布局等,可能仍会觉得有用。] 官方的Go网站讨论了GOPATH以及如何布置工作空间目录。 -在您的Shell中运行它,然后将其添加到或等效版本中,以便将来为您设置。Go会在安装包,以及,子目录那里。您需要将自己的软件包放

  • 问题内容: 我尝试使用下面的代码将命令输出存储在数组中,但是在“ while循环”之后无法打印数组元素,这意味着在代码的最后一行中,我的代码是否存在任何问题? 问题答案: 问题是您在 子 外壳中添加了元素。详细说明: 导致在子shell中执行,这是一个单独的执行环境。这意味着设置的变量不适用于 当前 外壳,其执行环境不会受到影响。您可以改为使用流程替代来实现相同目的: 请注意,不建议解析。尝试使用