2013-07-31 5 views
5

Podczas próby zdefiniowania właściwości zakresu lokalnego okazało się, że właściwości zdefiniowane za pomocą '@' nie są dostępne bezpośrednio w funkcji łącza, podczas gdy nie jest to właściwość sprawa opisanymi z '=' lub '&'Kątowa: właściwość zakresu lokalnego zdefiniowana za pomocą '@' nie jest dostępna z funkcji łącza

Oto prosty dyrektywa pisałem (jsfiddle):

angular.module('test', []) 
    .controller('testCtrl', function($scope) { 
     $scope.count1 = 5; 
    }) 
    .directive('testDir', function() { 
     return { 
      restrict: 'A', 
      scope: { 
       count: '=', 
       readonly: '@' 
      }, 
      link: function (scope, elem, attrs) { 

       console.log('Outside has count? '+('count' in scope)); 
       console.log('Outside has readonly? '+('readonly' in scope)); 

       scope.$watch('count', function(value){ 
        console.log('Inside has count? '+('count' in scope)); 
        console.log('Inside has readonly? '+('readonly' in scope)); 
        elem.text(value); 
       }); 
      } 
     }; 
}); 

wyjście jest:

Na zewnątrz ma "liczyć"? true

Na zewnątrz jest "tylko do odczytu"? false

Wewnątrz ma "count"? true

Wewnątrz ma "tylko do odczytu"? prawda

Nie mam pojęcia, dlaczego scope.readonly (@) nie jest zdefiniowany poza zasięgiem. Funkcja zegarka, podczas gdy nie jest to w przypadku scope.count (=)?

Odpowiedz

6

To jest rzeczywiście oczekiwany wynik, cytowany z angular doc:

... podczas fazy łączącej interpolacja nie został jeszcze oceniony i tak wartość jest w tej chwili ustawiony na nieokreślone.

Jeśli chcesz uzyskać wartość atrybutu można użyć $observe lub attrs.readonly:

link: function (scope, elem, attrs) { 
    ... 

    console.log('readonly = ' + attrs.readonly); 

    attrs.$observe('readonly', function(value) { 
     console.log('readonly = ' + value); 
    }); 

    ... 
}