2017-12-22 2 views
0

Ich versuche, ein Zeichenfolge-Datum zu konvertieren, so dass es auf einer HTML-Eingabe mit dem Typ funktioniert, der auf "Datum" festgelegt ist.Konvertieren Zeichenfolge in Datum in AngularJS-Direktive

Also, ich habe folgende Winkel App:

(function() { 

    var app = angular.module('test', []); 

    app.controller('MainCtrl', function($scope) { 
     $scope.load = function() {      
      $scope.message='2017-12-23T00:00:00Z'; 
     }; 
    }); 

    app.directive('convertDate', function() { 
     return { 
      restrict: 'A', 
      scope: { 
       ngModel: '=' 
      }, 
      link: function (scope) {  
       console.log(scope); 
       console.log(scope.ngModel); 

       if (scope.ngModel) scope.ngModel = new Date(scope.ngModel); 
      } 
     };    
    }); 
})(); 

Dann ist mein html wie folgt:

 <div ng-controller='MainCtrl'>   
     <input type="date" convert-date ng-model="message">    
     <button ng-click="load()">load</button> 
    </div> 

Wenn ich auf die Schaltfläche Last ich auf die folgende Fehlermeldung erhalten:

Fehler: [ngModel: datefmt] http://errors.angularjs.org/1.6.4/ngModel/datefmt?p0=2017-12-23T00%3A00%3A00Z

Ich verstehe den Fehler i s weil es eine Zeichenfolge ist und ich ein Datum brauche, was der Grund für meine Anweisung ist.

Aber selbst mit der Direktive bekomme ich immer noch den Fehler.

Was fehlt mir?

Dank

Colin

+0

Warum müssen Sie der Eingabe eine Direktive hinzufügen? Fügen Sie einfach 'ng-change =" convertToDate() "' zur Eingabe hinzu, um die Eingabe in ein Datum aus dem Controller selbst zu transformieren. Sie werden in diesem Fall keine Anweisung benötigen. –

+0

Ja, aber ich habe eine Menge Seiten, wo ich diese verwenden muss und jede Seite hat ihren eigenen Controller. Ich möchte nicht die Methode auf jedem Controller. – Sun

+0

Dann könnte ich vorschlagen, stattdessen einen Service hinzuzufügen, würde es die 'convertToDate' Methode, die Sie in all Ihren Controllern verwenden können, um die Arbeit ohne die Notwendigkeit für Richtlinie Shenanigans tun. –

Antwort

1

Sie können Ihre Richtlinie ändern, um folgende:

angular.module('app').directive('convertDate', function() { 
    return { 
     require: 'ngModel', 
     link: function(scope, elem, attrs, ctrl) { 
     if (!ctrl) return; 

     ctrl.$parsers.push(function(date) { 
      if (angular.isDate(date)) 
      return new Date(date); 
     }) 
     } 
    } 
    }) 

werfen Sie einen Blick auf dieses Arbeits plunkr ohne Fehler https://plnkr.co/edit/8aSR1dlsRfDMrM7GfQQa?p=preview

+0

gleichen Fehler wie zuvor – Sun

+0

überprüfen Sie den Plotter, es funktioniert. – Rachmaninoff

0

Es ist, weil Sie dieselbe Variable in ng-Modell für die Umwandlung verwendet werden. Es trifft also auf einen Fehler, bevor Ihre Anweisung es konvertiert.

Meiner Meinung nach sollten Sie es zuerst konvertieren und dann der ng-Modell-Variable in Ihrem Controller zuweisen.

Wie diese

(function() { 

    var app = angular.module('test', []); 

    app.controller('MainCtrl', function($scope) { 
     $scope.load = function() { 
      var dateString = '2017-12-23T00:00:00Z'; 
      $scope.message=new Date(dateString); 
     }; 
    }); 

})(); 

Keine Notwendigkeit Richtlinie verwenden

Verwandte Themen