我採用了棱角分明的UI引導日期選擇器時: https://angular-ui.github.io/bootstrap/#/datepicker解析日期字符串Date對象加載UI角引導日期選擇器
當使用從服務器接收到的數據我呈現的形式,有一個與日期時間字段問題。我輸入日期選擇器看起來是這樣的:
<form name="itemForm">
<input type="datetime" class="form-control" id="startedAt" name="startedAt"
ng-model="item.startedAt"
ng-click="open($event, 'startedAt')"
uib-datepicker-popup="yyyy-MM-dd"
is-open="datepickers.startedAt"
/>
</form>
我的服務器返回的響應日期時間爲JSON字符串:
{
...
startedAt: "2015-05-29T02:00:00+0200"
}
當我給你響應數據模型$scope.item = response;
,日期選擇器輸入字段被正確地渲染(正確的日期是選中它並按我選擇的格式正確格式化)。問題是驗證不通過。我得到:
itemForm.startedAt.$invalid == true
我注意到,綁定到日期選擇現場數據應該是Date
對象,而不是字符串(當我選擇從日期選擇新的日期,$scope.item.startedAt
是Date
)
我設法解決這個問題,併爲此在控制器:
$scope.item = response;
$scope.item.startedAt = new Date($scope.item.startedAt);
是這樣工作的。但我不希望手動轉換字符串做的日期我都能收到服務器的響應時間。我試圖創建一個指令,我可以分配到日期選擇器輸入字段,以便將其轉換爲我ng-model
:
.directive("asDate", function() {
return {
require: 'ngModel',
link: function (scope, element, attrs, modelCtrl) {
modelCtrl.$formatters.push(function (input) {
var transformedInput = new Date(input);
if (transformedInput != input) {
modelCtrl.$setViewValue(transformedInput);
modelCtrl.$render();
}
return transformedInput;
});
}
}
})
那麼它的作品,因爲現在我可以看到在我看來Date
對象,當我輸出模式:{{item.startedAt}}
。但仍然驗證失敗!我懷疑這是我理解數據如何在模型和視圖之間流動以及UI Bootstrap如何掛鉤的問題。
而且當我改變我的指令從$formatters.push
到$formatters.unshift
,審定工程確定,但日期選擇不格式化我的日期時間(insted的的很好formattet yyyy-MM-dd
我看到裏面輸入ISO字符串)
噢人! –
@VictorParmar目前我正在這樣做 - 從服務器接收時將響應字符串轉換爲Date對象。並且在發送到服務器時將Date對象轉換爲字符串。所有這些都是在Angular controller中手動完成的。也許我只是將這個邏輯提取爲Angular服務,但我認爲它不可能與指令 – rsobon
一起加入俱樂部 - 我們最終也做了同樣的事情:)當您使用JavaScript for-in循環時,您可能會遇到同樣的問題: –