我的指令中有这个链接功能:
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);
}
}
});
}
我无法看到变量&#34; attrs&#34;请有人帮我解决这个错误。
错误是&#34;无法读取属性&#39; paramX&#39;未定义的(...)&#34;
答案 0 :(得分:0)
你在该指令中有一个孤立的范围吗?如果您的答案是肯定的,则可以使用自己定义的参数。请查看:https://docs.angularjs.org/guide/directive,在第34节中;隔离指令的范围&#34;。
另一方面,如果您不能使用隔离范围从外部获取属性,则可以添加&#34; attrs&#34;进入范围,可从指令内的任何地方访问。它有点hacky解决方案,可能不太理想,但可能有效。你的代码就像那样:
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);
}
}
});
}
这个糟糕的解决方案根本不提供绑定,因此第一个attrs值将保留在范围变量中。