2016-06-08 62 views
1

读取性能我有我指导这个链接功能:指令不能从“ATTRS”

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’的未定义(......)”

+0

该DOM元素是否有任何paramX属性 – brk

回答

0

你有在该指令中一个孤立的范围是什么?如果你的答案是肯定的,你可以使用你自己定义的参数。请在“隔离指令的范围”一节中查看: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); 
      } 
     } 
    }); 
} 

这蹩脚的解决方案不提供约束力可言,因此第一个ATTRS值将保持在范围变量。

+0

感谢您的帮助,现在问题是我已经在多个html元素中定义了该指令,并覆盖了该变量的值。我如何防止这种情况? –

+0

我找到了解决方案,你只需要在这个指令中声明一个新的空范围* scope:{} * –