2013-07-23 7 views
59

क्या सेवा के अंदर वस्तुओं की एक सरणी पर $watch सेट करना संभव है (मुझे $watch घोषणा स्वयं सेवा के अंदर होने की इच्छा है)?

उत्तर

120

आप $rootScope इंजेक्शन करके घड़ियों के सेट में कोई अभिव्यक्ति जोड़ सकते हैं और फ़ंक्शन का उपयोग $watch विधि पर पहला तर्क कर सकते हैं। छद्म कोड:

$rootScope.$watch(function() { 
    return //value to be watched; 
}, function watchCallback(newValue, oldValue) { 
    //react on value change here 
}); 

$watch विधि करने के लिए तृतीय, बूलियन तर्क के बारे में मत भूलना। यदि आप परिवर्तनों के लिए एक संपूर्ण वस्तु को गहराई से देखना चाहते हैं तो आपको true निर्दिष्ट करने की आवश्यकता है।

+0

यदि आप कोई आपत्ति नहीं है, मैं तुम्हें थानेदार चाहते हैं हम आपको पहले फ़ंक्शन से रिटर्निंग सेवा मान का संदर्भ कैसे देते हैं। मैंने अपनी पूरी कोशिश की, लेकिन बदलावों के लिए देखने में सफल नहीं हुआ।वही मूल्य लगातार, बार-बार लौटाया जा रहा था। – Birowsky

+0

@ बिरोव्स्की क्या आपने '$ watchCollection' की कोशिश की है? –

+0

यह मदद नहीं करता है क्योंकि यह पूरे एप्लिकेशन के लिए रूटस्कोप देख रहा है। – btm1

15

उनकी प्रकृति से सेवाएं कक्षाओं और घर के तरीकों की तरह हैं।

app.service('myservice',function(){ 
    this.listen = function($scope) { 
     $scope.$watch(function(){return someScopeValue},function(){ 
      //$scope.dosomestuff(); 
     }); 
    } 
}); 

//your controller 

function myCtrl($scope,myservice) { 
    $scope.listen = function() { 
     myservice.listen($scope); 
    } 

    //call your method 
    $scope.listen(); 
} 

अद्यतन:: आप एक तरीका है जिसके आप अपने नियंत्रक जो तर्क गुंजाइश है और एक घड़ी अभिव्यक्ति लागू होता है से फोन सेट कर सकते हैं आप एक सेवा के अंदर एक निजी स्थानीय चर देखने का प्रयास कर रहे हैं, तो स्वीकार किए जाते हैं को देखने के रूट रूटस्कोप का उपयोग कर जवाब दें। यदि आप उपरोक्त की तुलना में स्थानीय दायरे में $ स्कोप वैरिएबल देखने की कोशिश कर रहे हैं तो आपकी सबसे अच्छी शर्त है। वे दो बहुत ही अलग चीजें प्राप्त कर रहे हैं।

+0

यह एक बेवकूफ सवाल की तरह प्रतीत हो सकता है लेकिन आप एक फ़ंक्शन के अंदर 'myservice.listen ($ scope)' क्यों डाल रहे हैं? क्या यह पूरे कोड में आसानी से इसका उपयोग कर रहा है या क्या कोई महत्वपूर्ण कारण है? इसके अलावा, अगर मैं एक कारखाने में $ घड़ी डालता हूं, तो क्या यह अभी भी काम करेगा? –

0

क्या आप यह स्पष्ट कर सकते हैं कि आप क्या हासिल करना चाहते हैं? जैसा कि मैं समझता हूं, आपको सर्वर से ऑब्जेक्ट्स की एक सरणी मिल रही है जो आपके मॉडल के रूप में है। तो फिर यह स्पष्ट नहीं है:

  1. आप यदि सरणी में कुछ वस्तुओं बदल दिया गया है सत्यापित करने के लिए करना चाहते हैं (शायद के बाद से मामले में सर्वर के लिए पिछले कॉल आप बार-बार होने पूलिंग करते हैं)?
  2. क्या आप सत्यापित करना चाहते हैं कि सरणी में कुछ ऑब्जेक्ट उपयोगकर्ता द्वारा कुछ फ्रंट-एंड कंट्रोल तत्वों के माध्यम से बदल दिए गए हैं?

मामले 1 में, आप वास्तव में $ उपयोग करने के लिए घड़ी (या बल्कि $ watchCollection) की जरूरत नहीं है, लेकिन आप सरणी आप सर्वर से प्राप्त के माध्यम से पुनरावृति और परिवर्तन (एक ही क्या $ watchColleciton करना होगा की पुष्टि करनी चाहिए)। यदि ऑब्जेक्ट वर्तमान में आपके पास अलग है - तो आप इस तत्व पर ऑब्जेक्ट कॉल करें। $ Save()।

2 मामले में, $ सेवा कोलेक्शन() का उपयोग अपने सेवा फ़ंक्शन के पैरामीटर के रूप में पारित $ स्कोप पर करें या $ रूटस्कोप का उपयोग करें यदि आप $ arrayScope में अपनी सरणी रखते हैं।

यदि आप परिदृश्यों को स्पष्ट करेंगे तो मैं आपको वास्तविक कोड प्रदान कर सकता हूं।

0

अरे बस एक ऐसी स्थिति थी जहां मेरे पास 2 अलग-अलग नियंत्रकों पर एक बहुत बड़ा घड़ी सेटअप था।

मैं किसी भी कोड मैं सिर्फ अपनी सेवा में कार्य करने के लिए परिभाषित नकल नहीं करना चाहता था के रूप में:

angular 
    .module('invoice') 
    .factory('invoiceState', function() { 
     var invoice = { 
      client_info: { 
       lastname: "", 
       firstname: "", 
       email: "", 
       phone: "", 
       id_client: "", 
       ... 
      } 
     } 
     invoice.watchAccommodation = function (newVal, oldVal) { 
      var accommodation = newVal; 
      //Whatever you would normally have in your watch function 
     } 

तो मैं सिर्फ इस समारोह किसी भी नियंत्रक की घड़ी है जिसमें मैं सेवा इंजेक्शन में कॉल कर सकते हैं

function NewInvoiceCtrl(invoiceState) { 
    $scope.$watch('invoice.accommodation',invoiceState.watchAccommodation, true); 
} 

मैं तो मैं वास्तव में इस दृष्टिकोण का प्रदर्शन पहलुओं में नहीं जा सकते, लेकिन यह काम करता है AngularJS का अधिक अनुभव नहीं है,)

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