【发布时间】:2016-02-11 02:36:31
【问题描述】:
我正在使用 Angular UI Bootstrap Datepicker: https://angular-ui.github.io/bootstrap/#/datepicker
当我使用从服务器接收到的数据呈现表单时,日期时间字段存在问题。我的输入日期选择器如下所示:
<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
我注意到绑定到 datepicker 字段的数据应该是 Date 对象而不是字符串(当我从 datepicker 中选择新日期时,$scope.item.startedAt 是 Date)
我设法解决了这个问题并在控制器中执行此操作:
$scope.item = response;
$scope.item.startedAt = new Date($scope.item.startedAt);
它是这样工作的……但我不想每次从服务器收到响应时都手动转换字符串做日期。我尝试创建一个指令,我可以将其分配给 datepicker 输入字段,以便它为我转换 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 时,验证工作正常,但 datepicker 没有格式化我的日期时间(插入了很好的格式化 yyyy-MM-dd 我在输入中看到 ISO 字符串)
【问题讨论】:
-
天啊,我们在这里遇到了完全相同的问题!!!
-
@VictorParmar 目前我正在这样做 - 从服务器接收时将响应字符串转换为 Date 对象。并在发送到服务器时将 Date 对象转换为字符串。所有这些都在 Angular 控制器中手动完成。也许我会将这个逻辑提取为 Angular 服务,但我认为它不可能与指令有关
-
是的,加入俱乐部 - 我们最终做了同样的事情 :)
标签: json angularjs datepicker angular-ui angular-ui-bootstrap