角度1.3.0并输入[type = string]

Dav*_*avy 9 angularjs angular-directive

我们最近更新了我们的应用程序以使用最新的角度版本,从版本到1.3.0到1.5.0之前.显然我们现在碰到1.3.0中引入的突破性变化:

https://github.com/angular/angular.js/issues/9218

我们有一个自定义指令,使我们能够使用pikaday日期选择器:

module.directive('pikaday', function () {
    return {
        require: 'ngModel',
        link: function preLink(scope, element, attrs, controller) {
            var $element = $(element),
                momentFormat = 'DD/MM/YYYY',
                year = new Date().getFullYear();

            // init datepicker
            var picker = new Pikaday(
                {
                    field: document.getElementById(attrs.id),
                    firstDay: 1,
                    format: momentFormat,
                    minDate: new Date((year - 1) + '-01-01'),
                    maxDate: new Date((year + 1) + '-12-31'),
                    yearRange: [year - 1, year + 1],
                    onSelect: function (date) {
                        controller.$setViewValue(date);
                    },
                    defaultDate: scope.$eval(attrs.ngModel), // require: 'ngModel'
                    setDefaultDate: true
                });

            // format model values to view
            controller.$formatters.unshift(function (modelValue) {
                var formatted = (modelValue)
                    ? moment(modelValue).format(momentFormat)
                    : modelValue;
                return formatted;
            });

            // parse view values to model
            controller.$parsers.unshift(function (viewValue) {
                if (viewValue instanceof Date) {
                    return viewValue;
                }
                else {
                    return moment(viewValue, momentFormat).toDate();
                }
            });
        }
    };
})
Run Code Online (Sandbox Code Playgroud)

这曾经工作正常,但现在绑定具有此控件的表单后,我的范围值突然从Date对象更改为字符串(没有与控件交互!)有趣的是,这发生在没有格式化程序或解析器被调用.所以看起来像angular只是决定更改范围值只是因为它被绑定为"text"类型的输入,即使输入中的值从未被触及.

我不想使用输入[type = text],因为我不希望浏览器强制自己处理日期.

如果我的格式化程序/解析器会被调用,我会知道如何解决这个问题,但这让我感到困惑.

我可以只在一个范围内显示一个日期,并有一个按钮,用户可以点击以生成pikaday插件,但我更喜欢这种行为保持原样...

mic*_*ico 2

您是否从https://github.com/angular-ui/bootstrap/issues/2659看到了此解决方法?

您所要做的就是添加一个指令:

directive('datepickerPopup', function (){
  return {
    restrict: 'EAC',
    require: 'ngModel',
    link: function(scope, element, attr, controller) {
    //remove the default formatter from the input directive to prevent conflict
    controller.$formatters.shift();
   }
 }
})
Run Code Online (Sandbox Code Playgroud)

解决方法删除了 1.3.0 版本引入的不太好的工作格式化程序,从而解决了该问题。

这个修复应该能够成功,因为它在 github 线程中得到了广泛的感谢。