什么才是真正的“angular”?在textarea字段上实现maxlength的方法
What's a truly "Angularesque" way to implement maxlength on a textarea field?
我正在写一个指令来强制textarea字段(HTML版本<我用的是AngularJS。因此,我想以正确的AngularJS方式完成它。然而,当我按照我的理解做"Angularesque"时,我不能完全让它工作。>
(function () {
'use strict';
var myAppModule = angular.module('myApp', []);
myAppModule.controller('MyController', function($scope) {
$scope.textareaText = "";
});
myAppModule.directive('myMaxlength', ['$compile', '$log', function($compile, $log) {
return {
priority: 10000,
restrict: 'A',
require: 'ngModel',
compile: function (elem, attrs) {
elem.attr("ng-trim", "false");
return function(scope, linkElem, linkAttrs, ctrl) {
var maxlength = parseInt(linkAttrs.myMaxlength, 10);
ctrl.$parsers.push(function (value) {
$log.info("In parser function value = [" + value + "].");
if (value.length > maxlength)
{
$log.info("The value [" + value + "] is too long!");
value = value.substr(0, maxlength);
ctrl.$setViewValue(value);
ctrl.$render();
$log.info("The value is now truncated as [" + value + "].");
}
return value;
});
};
}
};
}]);
})();
这几乎可以工作(请参阅此处的JSFIDDLE)。注意:这个小提琴已经更新为下面选择的解决方案,但是上面的代码仍然显示这里提到的问题。它正确地限制了进入模型的字符,并将其呈现回显示器。但是,您可以继续输入空格以超过指定的maxlength。多余的空间不会进入模型,但会使展示变得杂乱。我相信这和ng-trim有关。正如您所看到的(在代码片段中),我正在编译函数中设置该属性,但到那时已经太晚了。有人建议在编译函数中手动调用compile来强制AngularJS识别动态添加的属性,但这"似乎"是在创建另一个副本,并不能解决显示问题。将ng-trim="false"
放在textarea元素上工作,但我想要一个干净的解决方案,其中所有用户需要做的就是添加一个指定最大长度的属性。
这里是另一个例子(见这里的JSFIDDLE),在我看来,它不太像"Angularesque",但已经完成了工作。
(function () {
'use strict';
var myAppModule = angular.module('myApp', []);
myAppModule.controller('MyController', function($scope) {
$scope.textareaText = true;
});
myAppModule.directive('myMaxlength', ['$log', function($log) {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
var maxlength = parseInt(attrs.myMaxlength, 10);
$log.info("maxlength=[" + maxlength + "]");
elem.bind('keydown', function (event) {
$log.info("elem.val().length=[" + elem.val().length + "]");
if (elem.val().length >= maxlength)
{
// Void event Except backspace
if (event.keyCode != 8){
event.preventDefault();
}
}
});
}
};
}]);
})();
那么,在textarea字段上实现maxlength的真正"Angularesque"方法是什么?提前感谢!
你可以在你的html文件(文档在这里:https://docs.angularjs.org/api/ng/directive/input)的输入字段中使用ngMaxlength参数
例如<input type="text" ng-model="myRestrictedText" ng-maxlength="10"/>
您可以使用$attr.$set()
(参见文档)以ngModel
可以识别的方式添加ng-trim
属性。
在编译函数中修改这一行代码:
elem.attr("ng-trim", "false");
:
attrs.$set("ngTrim", "false");
注意:记住将属性值更改为camelCase!
你也可以在链接函数中这样做(不需要编译函数):
linkAttrs.$set("ngTrim", "false");
jsfiddle: http://jsfiddle.net/J7MJF/7/
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 而循环只设置php中输入字段中的第一个值
- 在输入字段中将最小金额设置为
- 从Rally获取一个特定的标记,以便计算另一个字段中的值
- 如何在输入字段中的按钮的帮助下打开日历,该字段的类型为“=”;日期”;
- JavaScript 检查隐藏字段中的值并将其设置为隐藏字段值
- 在wordpress一定时间后更改自定义字段
- 如何在HTML输入字段中添加不可删除的后缀
- Meteor-添加用户自定义字段的方法不起作用
- 互斥单选按钮和相应的输入字段
- 在IE9中的输入字段中输入焦点最近按钮
- 选中单选框时将属性添加到输入字段
- 访问存储在textarea字段中的URL
- 使用jquery将选中的字段放入textarea中
- 如何为textarea字段的代码添加换行?
- 什么才是真正的“angular”?在textarea字段上实现maxlength的方法
- 使用Javascript克隆一个Textarea字段及其值
- Innerhtml创建textarea字段
- 在ExtJs 4.1粘贴事件中无法获取textarea字段的值
- 在X-Editable jQuery库生成的Textarea字段上运行Textarea Resizer jQuery插件