Угловой UI Bootstrap datepicker: ng-поддержка только для чтения

Angular UI Bootstrap datepicker не чтит атрибут 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 выглядит ужасно.

  • замена текстового ввода datepicker на другое поле ввода только для чтения без прикрепленного datepicker.

    <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 и должен что-то пропустить. Есть ли лучший способ сделать поля ввода с помощью отмечать действительно только для чтения?

3 ответов


ваш третий подход довольно хорош, имхо.

учитывая, что сам datepicker явно не поддерживает свойство readonly, я не вижу другого способа сделать его доступным только для чтения (и вы даже создали для него директиву)

ваш второй подход иногда приводит к незначительному мерцанию при нажатии на вход (это только я?)

Как Настройки, не могли бы Вы уточнить, почему это трудно сделать? Вам придется передать все возможные атрибуты первоначальная директива до вашей директивы, я полагаю?


ng-disabled="true"

работал для меня. Angularjs: 1.2.9 и ui-boostrap: 0.8.0

к сожалению у меня не хватает репутации, чтобы прокомментировать оригинальный ответ


использовать ng-disabled="true"

<input type="text" class="form-control" datepicker-popup="{{format}}" ng-model="date" min="minDate" max="maxDate" ng-disabled="true" readonly="true"/>