我的指令中有这个链接函数:
link: function(scope, element, attrs, ngModel) {
ngModel.$formatters.push(function(value) {
return $filter('number')(value, 0);
});
element.bind('keyup', function($event) {
var start = this.selectionStart;
var end = this.selectionEnd;
if ($event.keyCode < 36 || $event.keyCode > 40) {
var valor = ngModel.$viewValue;
valor = valor.replace(/\./g, '');
valor = valor.replace(/[a-zA-Z]/g, '');
console.log(attrs.paramX);
element.val($filter('number')(valor, 0) || "");
if ($event.keyCode !== 8 && valor.length % 3 == 1) {
this.setSelectionRange(start + 1, end + 1);
} else {
this.setSelectionRange(start, end);
}
}
});
}
我看不到变量“attrs”,请有人帮助我解决这个错误。
错误是“无法读取未定义(…)的属性'paramX'”
最佳答案
该指令中有独立的范围吗?如果您的答案是肯定的,您可以使用自己定义的参数。检查这个:https://docs.angularjs.org/guide/directive ,在“隔离指令的范围”部分。
另一方面,如果您无法使用隔离范围从外部获取属性,您可以将“attrs”添加到范围中,以便可以从指令内的任何位置访问。这是一个有点老套的解决方案,可能不太理想,但可能有效。你的代码将是这样的:
link: function(scope, element, attrs, ngModel) {
/*
* INITIALIZATION
*/
scope.attrs = attrs;
ngModel.$formatters.push(function(value) {
return $filter('number')(value, 0);
});
element.bind('keyup', function($event) {
var start = this.selectionStart;
var end = this.selectionEnd;
if ($event.keyCode < 36 || $event.keyCode > 40) {
var valor = ngModel.$viewValue;
valor = valor.replace(/\./g, '');
valor = valor.replace(/[a-zA-Z]/g, '');
/*
* SCOPE ATTRS
*/
console.log(scope.attrs.paramX);
element.val($filter('number')(valor, 0) || "");
if ($event.keyCode !== 8 && valor.length % 3 == 1) {
this.setSelectionRange(start + 1, end + 1);
} else {
this.setSelectionRange(start, end);
}
}
});
}
这个糟糕的解决方案根本不提供绑定(bind),因此第一个 attrs 值将保留在范围变量中。
关于javascript - 指令无法从 "attrs"读取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37707299/