- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一个没有日历 View 的出生日期类型的输入元素。即用户通过键入来填写日期。
代码
angular.module('myApp', [])
.directive('birthDatePicker', [ function () {
return {
restrict: 'A',
require: 'ngModel',
scope: {
model: '=ngModel',
},
link: function (scope, element, attrs, ngModel) {
//SET CURSOR POSITION
var setCursorPosition = function(pos) {
if (element[0].setSelectionRange) {
element[0].focus();
element[0].setSelectionRange(pos, pos);
} else if (element[0].createTextRange) {
var range = element[0].createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
};
// RESET VALIDATION ERRORS
var resetErrors = function() {
ngModel.$setValidity('pattern',true);
};
if (!ngModel) return;
var d1, d2, m1, m2, y1, y2, y3, y4, cursorPos, dateString, parsedDate;
ngModel.$parsers.unshift(function (inputValue) {
var digits = inputValue.split('').filter(function (s) { return (!isNaN(s) && s != ' '); });
d1 = digits[0] ? digits[0] : 'd';
d2 = digits[1] ? digits[1] : 'd';
m1 = digits[2] ? digits[2] : 'm';
m2 = digits[3] ? digits[3] : 'm';
y1 = digits[4] ? digits[4] : 'y';
y2 = digits[5] ? digits[5] : 'y';
y3 = digits[6] ? digits[6] : 'y';
y4 = digits[7] ? digits[7] : 'y';
dateString = d1+d2+'/'+m1+m2+'/'+y1+y2+y3+y4;
resetErrors();
if(dateString == 'dd/mm/yyyy') {
ngModel.$viewValue = '';
ngModel.$render();
return ngModel.$viewValue;
}
ngModel.$viewValue = dateString;
ngModel.$render();
cursorPos = digits.length + 2;
if(digits.length < 3) {
cursorPos = digits.length;
} else if (digits.length < 5) {
cursorPos = digits.length + 1;
}
setCursorPosition(cursorPos);
parsedDate = new Date(ngModel.$viewValue);
// validation for correct date
if(isNaN(parsedDate.getTime())){
ngModel.$setValidity('pattern',false);
return ngModel.$viewValue;
} else {
ngModel.$setValidity('pattern',true);
}
return ngModel.$viewValue;
});
}
};
}]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.js"></script>
<body ng-app="myApp">
<form name="myForm" novalidate>
<input ng-model="date" name="question"
placeholder="dd/mm/yyyy" birth-date-picker type="tel" autocomplete="off" required>
<p ng-show="myForm.question.$error.required">Date is Required</p>
<p ng-show="myForm.question.$error['pattern']">Date is incorrect</p>
<input type="submit">
</form>
</body>
问题在于显示错误消息。消息 Date is required
仅在第一次和按下提交按钮时显示。当用户通过按 backspace
键清除输入值时,它不起作用。
更新:在较低版本的 AngularJS
上,它工作得很好,就像我想要的那样,但是在 AngularJS 1.5.8
上,我运气不好。 :(
请帮我解决这个问题。
编码愉快!
最佳答案
根据 https://docs.angularjs.org/api/ngMessages/directive/ngMessages 处的文档以及该页面上的示例,这就是您应该如何使用 ng-messages...
angular.module('myApp', [])
.directive('birthDatePicker', [ function () {
return {
restrict: 'A',
require: 'ngModel',
scope: {
model: '=ngModel',
},
link: function (scope, element, attrs, ngModel) {
//SET CURSOR POSITION
var setCursorPosition = function(pos) {
if (element[0].setSelectionRange) {
element[0].focus();
element[0].setSelectionRange(pos, pos);
} else if (element[0].createTextRange) {
var range = element[0].createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
};
// RESET VALIDATION ERRORS
var resetErrors = function() {
ngModel.$setValidity('pattern',true);
};
if (!ngModel) return;
var d1, d2, m1, m2, y1, y2, y3, y4, cursorPos, dateString, parsedDate;
ngModel.$parsers.unshift(function (inputValue) {
var digits = inputValue.split('').filter(function (s) { return (!isNaN(s) && s != ' '); });
d1 = digits[0] ? digits[0] : 'd';
d2 = digits[1] ? digits[1] : 'd';
m1 = digits[2] ? digits[2] : 'm';
m2 = digits[3] ? digits[3] : 'm';
y1 = digits[4] ? digits[4] : 'y';
y2 = digits[5] ? digits[5] : 'y';
y3 = digits[6] ? digits[6] : 'y';
y4 = digits[7] ? digits[7] : 'y';
dateString = d1+d2+'/'+m1+m2+'/'+y1+y2+y3+y4;
resetErrors();
if(dateString == 'dd/mm/yyyy') {
ngModel.$viewValue = '';
ngModel.$render();
return ngModel.$viewValue;
}
ngModel.$viewValue = dateString;
ngModel.$render();
cursorPos = digits.length + 2;
if(digits.length < 3) {
cursorPos = digits.length;
} else if (digits.length < 5) {
cursorPos = digits.length + 1;
}
setCursorPosition(cursorPos);
parsedDate = new Date(ngModel.$viewValue);
// validation for correct date
if(isNaN(parsedDate.getTime())){
ngModel.$setValidity('pattern',false);
return ngModel.$viewValue;
} else {
ngModel.$setValidity('pattern',true);
}
return ngModel.$viewValue;
});
}
};
}]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.js"></script>
<body ng-app="myApp">
<form name="myForm" novalidate>
<input ng-model="date" name="question"
placeholder="dd/mm/yyyy" birth-date-picker type="tel" autocomplete="off" required>
<div ng-messages="myForm.question.$error" role="alert">
<div ng-message="required">Date is Required</div>
<div ng-message="pattern">Date is incorrect</div>
</div>
<input type="submit">
</form>
</body>
关于AngularJS 自定义出生日期输入不显示所需的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39410981/
我有一个依赖于包 B 的包 A。当包 A 中的代码运行并访问包 B 中的类时,包 B 的状态将被解析 (4),而不是 Activity (32) 和包 B 的激活器也没跑好。我认为 bundle B
这个问题在这里已经有了答案: How to remove the space between inline/inline-block elements? (41 个回答) 关闭 7 年前。
我正在尝试使用 Java OpenAL 库。我在导入名为 libsoft_oal.so 的 native 库时遇到问题。 Java OpenAL 依赖于 OpenAL 软实现。我尝试根据他们在 git
我正在尝试启动我的应用程序。是一个 unicorn +工头+sinatra的应用。 这是我的 config.ru 文件: require "rubygems" require "sinatra" Bu
我有一个下拉列表,其中包含一些从数据库表中检索的值,我想要的是当单击按钮时它应该只获得选项标签的中间值,但只有那些类名为“get_this”的选项标签并离开那些选项,如果他们没有这个类 预期输出:值
我有一个index.php文件,需要一个通用的head.php文件,head.php文件中有几个Javascript文件,当这样尝试时,代码在源代码中看起来很好,但文件却不是实际上对文档做任何事情。
有人能帮帮我吗? 我已经像这样运行了 imsmod: $ insmod /data/mm/mmdev.ko epoll_rate=100 但是我得到一个错误: insmod: init_module
是否有键盘快捷键或插件可以在 Notepad++ 中打开 PHP 所需或包含的文件?我知道,在 Dreamweaver 中,执行此操作的命令是 Ctrl+D,但我似乎无法在 Notepad++ 中找到
我已经用 js 设置了一个显示/隐藏 div,但我很难弄清楚如何一次显示一个 div。目前发生的情况是,除非我再次单击原始链接来关闭该 div,否则每个 div 都会显示。 http://www.li
当我尝试将未分配的辅助分片分配给节点时出现错误。 { "error": { "root_cause": [ { "type": "remote_transpor
我正在构建一个 C++ 应用程序,使用 Netbeans 6.9 作为我的 IDE。我有一个 C++ 库,它是一个纯 C 库的包装器。 我已将文件正确添加到项目中(使用添加库文件选项)。这是 g++
我是一名优秀的程序员,十分优秀!