Атрибуты области действия директивы разбиваются в зависимости от имени атрибута

У меня очень странное явление с директивой и изолированным скоупом, где атрибуты в скоупе работают или не работают в зависимости от именования атрибута. Если я использую

{check:'@check'}

он работает просто отлично и как ожидалось. Однако, если я использую:

{checkN:'@checkN'}

определенная функция никогда не назначается. Пример будет выглядеть так:

HTML:

<item ng-repeat="list_item in model.list" model="list_item" checkN="checkName()" check="checkName()" position="$index"></item>'

JavaScript

app.directive('item', function(){
   return {
      restrict: 'E',
      replace : false,   
      scope:{
              $index: '=position',
              check: '&check',
              checkN: '&checkN',
              model:'='
      },          
      template: '',
      link: function(scope, element, attrs){
        console.log(scope.check())
        console.log(scope.checkN())          
      }
    }
});

Затем консоль выдаст мне следующее:

The checkName function has been called [which is the return string of the function]
undefined

Неужели это зависит от использования заглавных букв? Это было бы очень "неожиданным" поведением.

Спасибо за вашу помощь

Шаки


person schacki    schedule 27.03.2013    source источник
comment
Директивы имеют имена в верблюжьем регистре, такие как ngBind. Директиву можно вызвать, переведя имя регистра верблюда в регистр змеи с помощью этих специальных символов :, - или _. При желании к директиве можно добавить префикс x- или data-, чтобы сделать ее совместимой с валидатором HTML. -- Раздел Страница директив Вызов директив из HTML   -  person Mark Rajcok    schedule 27.03.2013


Ответы (1)


Html нечувствителен к регистру, поэтому myAttribute и myattribute будут неотличимы друг от друга в зависимости от браузера. Авторы Angularjs приняли дизайнерское решение о переходе от html к javascript и наоборот с точки зрения директив.

Директива ngRepeat будет использоваться как ng-repeat в представлении (html). Точно так же ваша директива checkN должна использоваться как check-n для того, чтобы angular распознал ее как директиву.

person Umur Kontacı    schedule 27.03.2013
comment
Большое спасибо за ответ. Команда angular четко задокументировала это для директив. Но, следуя документам, я не ожидал здесь такого же поведения. - person schacki; 28.03.2013
comment
@shacki Точно - в моем случае у меня были имена атрибутов, которые начинались с аббревиатуры - например. DNSHost=myhost, и Angular молча игнорировал их без какого-либо возможного перевода. В документации об этом ничего не сказано. Зря потратил 2 часа :( - person Jordan Rieger; 03.10.2015