2013-10-09 6 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 कैल नहीं है एलईडी।

कोई विचार क्यों?

उत्तर

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

एफडब्ल्यूआईडब्ल्यू, आप कारखाने को दायरे में भी असाइन कर सकते हैं और फिर एक स्ट्रिंग अभिव्यक्ति के साथ '$ watch' का उपयोग कर सकते हैं। –

+2

कृपया माइकल का मतलब क्या है, साझा करें। विकल्पों को देखना हमेशा अच्छा होता है। –

8

@ jusio के जवाब अप के बाद, यह भी जब तक आप दायरे से अपने कारखाने हिस्सा बनाने के एक स्ट्रिंग अभिव्यक्ति का उपयोग करना संभव है:

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

इसलिए क्योंकि जब एक $watch एक स्ट्रिंग अभिव्यक्ति के साथ प्रदान की जाती है है यही कारण है, यह अपने दायरे के खिलाफ है कि स्ट्रिंग मूल्यांकन करता है।

आपको यह तय करना चाहिए कि क्या यह आपके निर्देश के दायरे को खराब करने के लायक है ताकि आप एक तर्कसंगत रूप से अधिक पठनीय कोड प्राप्त कर सकें। यदि आप पहले से ही किसी अन्य कारण से कर रहे हैं, तो यह कोई बड़ा सौदा नहीं है।

संबंधित मुद्दे