2013-10-09 18 views
7

mam to fabryka,

.factory('authentication', [function() { 

    return { 
     loginRequired: false 
    }; 
    }]); 

mam ten kontroler,

.controller('TopNavCtrl', ['$scope', 'authentication', function($scope, authentication) { 

    $scope.login = function() { 
    authentication.loginRequired = true; 
    }; 

}]); 

i mam tę funkcję łącza w dyrektywie,

link: function(scope, element, attrs) { 

    scope.show = false; 

    scope.$watch(authentication.loginRequired, function(value) { 
     scope.show = value; 
    }); 
    } 

Po wykonaniu authentication.loginRequired = true; w kontrolerze, scope.$watch w dyrektywie nie jest cal doprowadziło.

Jakieś pomysły, dlaczego?

Odpowiedz

22

Scope.$watch przyjmuje jako pierwszy parametr wyrażenie lub funkcję. To, co przekazujesz jako pierwszy parametr, to wartość zapisana w authetication.loginRequired.

Po zadziała (zakładając, że masz poprawnie wstrzykuje authetication fabrykę):

link: function(scope, element, attrs) { 

    scope.show = false; 

    scope.$watch(function(){return authentication.loginRequired;}, function(value) { 
     scope.show = value; 
    }); 
    } 
+0

FWIW, możesz również przypisać fabrykę do zakresu, a następnie użyć '$ watch' z wyrażeniem ciągu. –

+2

Proszę, podziel się tym, co masz na myśli, Michael. Zawsze dobrze jest zobaczyć alternatywne rozwiązania. –

8

Kontynuując odpowiedź @ jusio użytkownika, możliwe jest również użycie wyrażenia ciąg tak długo, jak sobie część fabrycznego zakresu:

scope.authentication = authentication; 
scope.$watch('authentication.loginRequired', function(value) { 
... 
}); 

to tak, ponieważ gdy $watch zaopatrzona jest wyrażenie tekstowe, ocenia, że ​​łańcuch przed jego zakresu.

Należy zdecydować, czy warto zająć się zakresem dyrektywy, aby można było uzyskać znacznie czytelniejszy kod. Jeśli robisz to już z innego powodu, to nic wielkiego.

Powiązane problemy