Angular UI Bootstrap date-picker В сочетании с UI.Mask

Я использую angular сборщик всплывающих подсказок для пользовательского интерфейса, чтобы создать директиву, которая легко позволит мне добавить сборщик дат, когда это необходимо.

Когда я совмещаю это с директивой uiMask, значения во входных данных скремблируются, когда я выбираю дату.

Вот мой html:

<p class="input-group">
    <input type="text" class="form-control" 
           ui-mask="99/99/9999"
           ng-model="ngModel" 
           ng-model="order.date" 
           datepicker-popup="MM/dd/yyyy" 
           is-open="opened" 
           datepicker-options="dateOptions" 
           date-disabled="disabled(date, mode)" 
           ng-required="true" 
           close-text="Close" />
    <span class="input-group-btn">
        <button type="button" class="btn btn-default" ng-click="open($event)">
            <i class="glyphicon glyphicon-calendar"></i>
        </button>
    </span>
</p>

И мой JS:

/**
 * DATE PICKER
 */
$scope.today = function () {
    $scope.dt = new Date();
};
$scope.today();

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

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

$scope.toggleMin = function () {
    $scope.minDate = $scope.minDate ? null : new Date();
};
$scope.toggleMin();

$scope.open = function ($event) {
    $event.preventDefault();
    $event.stopPropagation();

    $scope.opened = true;
};

$scope.dateOptions = {
    formatYear: 'yy',
    startingDay: 1
};

$scope.initDate = new Date('2016-15-20');
$scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];
$scope.format = $scope.formats[0];

Я хотел бы иметь возможность использовать функцию u-mask для упрощения дат ввода, не набирая / s. Возможно ли иметь возможность использовать их вместе?

Ответ 1

Следующий фрагмент работал у меня:

.config(function ($provide) {

  $provide.decorator('datepickerPopupDirective', function ($delegate) {
    var directive = $delegate[0];
    var link = directive.link;

    directive.compile = function () {
      return function (scope, element, attrs) {
        link.apply(this, arguments);
        element.mask("99/99/9999");
      };
    };

    return $delegate;
  });

});

Он просто украшает директиву datepicker с помощью маски jquery.maskedinput.js. Получайте удовольствие!


ОБНОВЛЕНИЕ (13 мая 2015 г.)

Плункер, чтобы проиллюстрировать его работу: http://plnkr.co/edit/fTFNu9Mp2kX5X1D6AJOx?p=preview

Ответ 2

Когда я пытаюсь воспроизвести ваш вызов, первое, что приходит на ум, - это:

new Date('2016-15-20');

возвращает

Invalid Date

Возможно, это место для поиска решения. Какая дата? 15-й месяц или 20-й месяц? В любом случае это не сработает. Укажите действительную дату для $scope.initDate. Возможно, вы имели в виду "2016-12-20"?

Можете ли вы создать небольшой пример ситуации, которую мы можем использовать для тестирования возможных решений? И что такое "скремблированный вход", о котором вы говорите? Опять же, пожалуйста, укажите пример как проблемы, так и желаемого результата.

Ответ 3

Проверьте Случай 4 в этом плунге: https://plnkr.co/edit/0Vr5YRVREIT5EMu1m55z?p=preview

добавлено: добавлено model-view-value = "true" :

<input name="date4" id="date4" type="text" class="form-control" uib-datepicker-popup="dd/MM/yyyy" 
    ui-mask="99/99/9999" placeholder="DD/MM/YYYY" ng-model="date4" ng-required="true" 
    model-view-value="true" is-open="popup4.opened" datepicker-options="dateOptions" 
    show-button-bar="false"/>
<span class="input-group-btn">
    <button type="button" class="btn btn-default" ng-click="open4()"><i class="fa fa-calendar fa-1"></i></button>
</span>