![](/img/trans.png)
[英]If statement in AngularJs not removing elements after update from 1.0.8
[英]Issues converting from AngularJS Version 1.0.8 to 1.4.2
我有一個可愛的日期下拉列表,適用於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;
});
}
};
})
謝謝
您的指令在1.3.0-beta.10中停止工作,可能是因為以下更改:
ngModel:如果沒有更改,請不要弄臟$ commitViewValue上的輸入
由於您使用對象作為視圖值:
scope.$watch(attrs.dateTypeMulti, function (viewValue) {
ngModel.$setViewValue(viewValue);
}, true);
將使用相同的對象引用, $commitViewValue
將在解析和驗證管道啟動之前認為沒有任何更改和中止。
$setViewValue
的文檔說明:
與標准輸入一起使用時,視圖值將始終為字符串(在某些情況下,它會被解析為另一種類型,例如輸入[date]的Date對象。)但是,自定義控件也可能將對象傳遞給此方法。 在這種情況下,我們應該在將對象傳遞給$ setViewValue之前復制該對象。 這是因為ngModel不會對對象進行深度監視,它只會查找身份的更改。 如果只更改對象的屬性,則ngModel將不會意識到對象已更改,並且不會調用$ parsers和$ validators管道。 因此,一旦將副本傳遞給$ setViewValue,就不應該更改副本的屬性。 否則,您可能會導致范圍上的模型值更改不正確。
更改為使用angular.copy
,它應該工作:
ngModel.$setViewValue(angular.copy(viewValue))
演示: https : //plnkr.co/edit/kSS56n6LlHej25vcjfQq?p = preview
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.