2016-03-16 4 views
9

Wir haben unsere Anwendung vor kurzem aktualisiert, um die neueste eckige Version von einer Version bis vor 1.3.0 bis 1.5.0 zu verwenden. Offenbar wir jetzt in eine unterbrechende Änderung in 1.3.0 eingeführt stoßen:angular 1.3.0 und eingang [type = string]

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

wir eine eigene Richtlinie hatte, die uns die pikaday Datumsauswahl aktiviert haben:

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(); 
       } 
      }); 
     } 
    }; 
}) 

Diese verwendet funktionieren , aber nach dem Binden eines Formulars mit diesem Steuerelement wird mein Bereichswert plötzlich von einem Date-Objekt in einen String geändert (ohne jemals mit dem Steuerelement zu interagieren!) Das Lustige ist, dass dies geschieht, ohne dass der Formatierer oder Parser jemals aufgerufen wird. Es sieht so aus, als würde eckig nur den Wert des Bereichs ändern, nur weil er an eine Eingabe vom Typ "Text" gebunden ist, selbst wenn der Wert in der Eingabe niemals berührt wird.

Ich möchte nicht die Eingabe [type = text] verwenden, weil ich nicht möchte, dass der Browser seine eigene Behandlung von Daten erzwingt.

Wenn mein Formatierer/Parser angerufen würde, würde ich wissen, wie man das umgeht, aber das hat mich verwirrt.

ich nur ein Datum in einer Spanne angezeigt werden könnte und eine Schaltfläche, um die Benutzer haben könnten Sie auf die pikaday-Plugin, um laichen, aber ich würde das Verhalten lieber als bleiben ...

Antwort

2

Sie diese Abhilfe gesehen aus https://github.com/angular-ui/bootstrap/issues/2659?

Alles, was Sie tun müssen, ist eine Richtlinie hinzuzufügen:

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(); 
    } 
} 
}) 

Arbeit entfernt um die nicht so schön Arbeitsformatierer von der 1.3.0-Version eingeführt und damit löst das Problem mit ihm.

Dieser Fix sollte es so machen, wie es im GitHub-Thread weithin gedankt wird.

+0

Danke mico. Ich habe es am Anfang der Linkfunktion meiner pikaday-Direktive hinzugefügt. Klappt wunderbar. Es ist allerdings eine Schande, dass wir eckigen Winkel anbringen müssen, um das zu funktionieren. – Davy