爲了允許smartFloat
指令,你應與$parsers
使用$validators
爲浮點值的有效性檢查空值。另請注意,從任何解析器返回undefined
(或不返回任何值)將標記整個表單無效。
允許空值
var FLOAT_REGEXP = /^\-?\d+((\.|\,)\d+)?$/;
app.directive('smartFloat', function() {
return {
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
// Parse
ctrl.$parsers.unshift(function (viewValue) {
if (!viewValue) {
return ''; // <-- Don't return undefined, but empty string instead
} else if (FLOAT_REGEXP.test(viewValue)) {
return parseFloat(viewValue.replace(',', '.'));
}
});
// Validate
ctrl.$validators.float = function (viewValue) {
if (viewValue === '') {
ctrl.$setValidity('float', true); // <-- Handle empty value as valid
return true;
} else if (FLOAT_REGEXP.test(viewValue)) {
ctrl.$setValidity('float', true);
return true;
} else {
ctrl.$setValidity('float', false);
return false;
}
};
}
};
});
活生生的例子看here。
我仍然無法得到它的工作。問題是表單本身被標記爲無效。該元素本身似乎沒有任何問題,但如果您沒有對指令進行輸入,則表單將被標記爲無效。 – 2014-09-29 08:26:42
@artbonghanoy你可以分享代碼(html + js)嗎?可能問題不在於指令本身。 – Vadim 2014-10-01 06:38:03
@Vadmin,我終於明白了。請在[stackoverflow]上閱讀此問題(http://stackoverflow.com/questions/25739986/what-is-the-purpose-of-the-new-built-in-parse-validation-key-in-angular-1 -3)。請使用1.3中的新驗證方案更新您的答案,以便我可以接受它。 – 2014-10-01 08:55:55