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

Смежные вопросы