2016-06-08 51 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:{} * –