2013-10-09 15 views
7

ho questa fabbrica,

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

    return { 
     loginRequired: false 
    }; 
    }]); 

ho questo controller,

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

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

}]); 

e ho questa funzione di collegamento in una direttiva,

link: function(scope, element, attrs) { 

    scope.show = false; 

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

Quando authentication.loginRequired = true; viene eseguito nel controller, lo scope.$watch nella direttiva non è cal guidato.

Qualche idea, perché?

risposta

22

Scope.$watch accetta come primo parametro espressione o funzione. Quello che stai passando come primo parametro è un valore memorizzato in authetication.loginRequired.

seguito funzionerà (supponendo di aver correttamente iniettato authetication di fabbrica):

link: function(scope, element, attrs) { 

    scope.show = false; 

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

FWIW, è anche possibile assegnare la fabbrica all'ambito e quindi utilizzare '$ watch' con un'espressione stringa. –

+2

Per favore, condividi ciò che intendi, Michael. È sempre bello vedere le alternative. –

8

In seguito la risposta di @ jusio, è anche possibile utilizzare un'espressione stringa finchè fate la vostra parte fabbrica del campo di applicazione:

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

Ecco perché quando un $watch è provvista di una stringa, si valuta che la stringa contro il suo ambito di applicazione.

Si dovrebbe decidere se valga la pena di ingombrare l'ambito della direttiva in modo da poter avere un codice discutibilmente più leggibile. Se lo stai già facendo per un altro motivo, allora non è un grosso problema.

Problemi correlati