2013-10-09 57 views
7

我有这样的工厂,

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

    return { 
     loginRequired: false 
    }; 
    }]); 

我有这样的控制器,

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

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

}]); 

和我在一个指令有这个链接功能,

link: function(scope, element, attrs) { 

    scope.show = false; 

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

authentication.loginRequired = true;在控制器中完成时,指令中的scope.$watch不是cal LED。

任何想法为什么?

回答

22

Scope.$watch接受作为第一个参数表达式或函数。您作为第一个参数传递的内容是存储在authetication.loginRequired中的

下面的工作(假设你已经正确地注入authetication厂):

link: function(scope, element, attrs) { 

    scope.show = false; 

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

FWIW,您也可以将工厂分配给作用域,然后使用'$ watch'和字符串表达式。 –

+2

请分享您的意思,迈克尔。看到替代品总是很好的。 –

8

跟进@ jusio的答案,这也是可以的,只要你做的范围你的工厂部分使用字符串表达式:

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

这是因为当$watch设有一个字符串表达式,它计算针对其范围是字符串。

你应该决定是否值得混淆你的指令的范围,这样你可以拥有一个可以说是更可读的代码。如果你因为另一个原因已经这么做了,那么这没什么大不了的。