【发布时间】:2013-12-14 14:38:32
【问题描述】:
Angular UI Bootstrap 日期选择器不支持 ng-readonly 属性。 如果 ng-readonly 表达式为真,则文本输入字段为灰色且无法修改,但会弹出 datepicker 的日历,允许修改表单字段。
到目前为止,我尝试了 3 种方法(请参阅 http://plnkr.co/edit/KHrbbI6W1pWG5ewSsE9r?p=preview),这两种方法都相当老套和丑陋:
-
如果 datepicker 应该是只读的,则禁用所有日期。
<input type="text" datepicker-popup="dd.MM.yyyy" ng-model="dt" ng-readonly="ro" date-disabled="disabled(date, mode)" />在 html 文件中和
$scope.$watch('ro', function(ro) { $scope.dt = new Date($scope.dt); // force datepicker div refresh }); $scope.disabled = function(date, mode) { return $scope.ro; };在控制器中。
-
不允许 datepicker popup div 弹出。
<input type="text" datepicker-popup="dd.MM.yyyy" ng-model="dt" ng-readonly="ro" is-open="opened" />在 html 文件中和
$scope.$watch('opened', function(v1, v2, v3) { if ($scope.ro && v1) { $timeout(function() { $scope.opened = false; }); } });在控制器中。闪烁的日期选择器看起来很糟糕。
-
用另一个没有附加日期选择器的只读输入字段替换日期选择器的文本输入。
<datepicker-ro-fix datepicker-popup="dd.MM.yyyy" ng-model="dt" ng-readonly="ro" />在 html 文件中和
m.directive('datepickerRoFix', function() { return { restrict: 'E', require: 'ngModel', scope: { ngModel: '=', ngReadonly: '=', }, template: '<span>' + '<input ng-hide="ngReadonly" type="text" datepicker-popup="dd.MM.yyyy" ng-model="ngModel" />' + '<input ng-show="ngReadonly" type="text" readonly="true" value="{{ ngModel | date:\'dd.MM.yyyy\'}}" />' + '</span>', }; });在 js 文件中。这似乎是迄今为止最好的解决方案,但缺点是现在有两个输入元素而不是一个,它们都有一些硬编码的属性。
第一种和第二种方法要求我在每个日期输入字段的表单控制器中添加一堆代码,第三种方法更难自定义。
我是 Angular 新手,应该遗漏一些东西。 有没有更好的方法让 datepicker 的输入字段真正只读?
【问题讨论】:
-
为什么不将日期显示为文本并隐藏输入,以便它仍然可用于角度验证目的
-
@charlietfl,它与我的第三种方法有何不同?
-
表示没有向用户显示输入...开玩笑的文字和一个按钮
-
对我来说这是一个“功能”,所以我可以禁用手动文本输入,只允许用户使用日期选择器进行选择。 :)
标签: angularjs datepicker angular-ui-bootstrap