我有一个可爱的日期下拉列表,适用于AngularJS V1.0.8,我试图使用V1.4.2运行它,但它似乎并不想玩球。
似乎是什么问题?我已经研究了版本的变化,但无法看到问题。
我有一个plunker,你可以看到它使用1.0.8工作,然后当你将第5行和第8行的版本更改为1.4.2时,它不起作用。
这些字段对于31/02/2000等日期应该无效,这是好的但不是在1.4.2
问题是什么?
https://plnkr.co/edit/5ckBkzN6xYEvJvyoO0Ax?p=preview
angular.module('dateApp', []);
angular.module('dateApp').
directive('dateTypeMulti', function () {
return {
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
ngModel.$render = function () {
angular.extend(scope.$eval(attrs.dateTypeMulti), ngModel.$viewValue);
};
scope.$watch(attrs.dateTypeMulti, function (viewValue) {
ngModel.$setViewValue(viewValue);
}, true);
ngModel.$formatters.push(function (modelValue) {
if (!modelValue) return;
var parts = String(modelValue).split('/');
return {
year: parts[0],
month: parts[1],
day: parts[2]
};
});
ngModel.$parsers.unshift(function (viewValue) {
var isValid = true,
modelValue = '',
date;
if (viewValue) {
date = new Date(viewValue.year, viewValue.month - 1, viewValue.day);
modelValue = [viewValue.year, viewValue.month, viewValue.day].join('/');
if ('//' === modelValue) {
modelValue = '';
} else if (
date.getFullYear() != viewValue.year ||
date.getMonth() != viewValue.month - 1 ||
date.getDate() != viewValue.day) {
isValid = false;
}
}
ngModel.$setValidity('dateTypeMulti', isValid);
return isValid ? modelValue : undefined;
});
}
};
})
由于
答案 0 :(得分:0)
您的指令在 1.3.0-beta.10 中停止工作,可能是因为以下更改:
ngModel:如果没有,则不会弄脏$ commitViewValue上的输入 改变
由于您使用对象作为视图值:
scope.$watch(attrs.dateTypeMulti, function (viewValue) {
ngModel.$setViewValue(viewValue);
}, true);
将使用相同的对象引用,$commitViewValue
将认为在解析和验证管道开始之前没有任何改变和中止。
$setViewValue
州的文档:
与标准输入一起使用时,视图值将始终为字符串 (在某些情况下,它被解析为另一种类型,例如Date 输入的对象[日期]。)但是,自定义控件也可能通过 这个方法的对象。在这种情况下,我们应该复制一份 对象在传递给$ setViewValue之前。这是因为ngModel 没有深入观察物体,它只会寻找变化 身份。如果只改变对象的属性 ngModel将不会意识到对象已更改,也不会 调用$ parsers和$ validators管道。出于这个原因,你 一旦传递给副本,就不应该更改副本的属性 $ setViewValue。否则,您可能会导致范围上的模型值 改变不正确。
更改为使用angular.copy
,它应该有效:
ngModel.$setViewValue(angular.copy(viewValue))