2015-09-07 101 views
3

發展新世紀通過離子移動應用格式的輸入日期,我有這樣的HTML:如何使用角1.3和進一步

<input type="date" ng-model="schedule.start" 
        name="startDate" 
        date-to-format /> 

我有這樣的指令,旨在對輸入內格式呈現的日期標籤

.directive('dateToFormat', function ($filter) { 
     return { 
      restrict: 'A', 
      require: 'ngModel', 
      link: function (scope, el, attrs, ctrl) { 
       ctrl.$parsers.push(function (data) { 
        return data; 
       }); 
       ctrl.$formatters.push(function (data) { 
        return $filter('date')(data, 'EEE dd MMMM yyyy'); 
        // error => filter returns a string, not a date object 
       }); 
      } 
     }; 
    }); 

但是,自從Angular 1.3以來,格式化程序必須返回一個Date對象而不是字符串等價物。使用

典型的錯誤這個指令:

Expected `mon. 07 september 2015` to be a date. 

如何使用角1.3和進一步格式的日期?
如果我包裹$filter圍繞new Date(...),我失去了自定義格式...

Plunkr再現問題:http://plnkr.co/edit/eMIHWjtwHSPLxBBYxYu9?p=preview

+0

您的格式化程序將日期值轉換爲字符串,那麼您的解析器呢?是否需要做相反的工作(將字符串轉換爲日期值)? – Rustam

+0

解析器已經將相應的Date對象返回給我。 – Mik378

+0

您不能可靠地更改輸入類型日期的格式。瀏覽器將在該字段中呈現區域設置的格式化日期。所以你的指示在這種情況下是無用的。 – dfsq

回答

-1

在這種情況下,最好使用<input type="text" />,而不是date更好的瀏覽器兼容性。它還可以防止Angular將值強制爲Date。您仍然可以在自定義指令中使用自定義分析器和格式器。

.directive('dateToFormat', function ($filter) { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function (scope, el, attrs, ctrl) { 
      ctrl.$parsers.push(function (data) { 
       return new Date(data); // Maybe use some parsing libraries. 
      }); 
      ctrl.$formatters.push(function (data) { 
       return $filter('date')(data, 'EEE dd MMMM yyyy'); 
       // Now you can return strings as you like! 
      }); 
     } 
    }; 
}); 
+0

你將失去​​移動組件的好處,在這種情況下,需要輸入日期。 https://www.google.com/search?q=ios+select+date&client=safari&rls=en&source=lnms&tbm=isch&sa=X&ved=0CAgQ_AUoAmoVChMIsue_8orlxwIVBF4aCh0D-wvt&biw=1285&bih=712#imgrc=ZfCfDQkHVlGkqM%3A – Mik378

+0

有關顯示如何' 觸摸屏版本,仍然使用桌面文本?然後,你可以獲得兩全其美的好處。 – FelisCatus

+0

這是一個移動應用程序;)離子不要打擾桌面。 – Mik378