javascript - AngularJS: फैक्टरी और सेवा?




angularjs-service angularjs-factory (3)

इस प्रश्न का उत्तर यहां दिया गया है:

जनवरी 2016 को संपादित करें: चूंकि यह अभी भी ध्यान देता है। यह पूछने के बाद से मैंने कुछ एंगुलरजेएस परियोजनाएं पूरी की हैं, और उन लोगों के लिए मैंने ज्यादातर factory उपयोग किया, एक वस्तु का निर्माण किया और अंत में वस्तु को वापस कर दिया। हालांकि, नीचे दिए गए मेरे बयान अभी भी सत्य हैं।

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

अगर मैंने वडर सेवा जैसी स्थापना की है (यानी एक सेवा के रूप में):

var module = angular.module('MyApp.services', []);

module.service('VaderService', function() {
    this.speak = function (name) {
        return 'Join the dark side ' + name;
    }
});

फिर मेरे नियंत्रक में मैं यह कर सकता हूं:

module.controller('StarWarsController', function($scope, VaderService) {
    $scope.luke = VaderService.speak('luke');   
});

सेवा के साथ, नियंत्रक में इंजेक्शन वाले VaderService को तत्काल किया जाता है, इसलिए मैं केवल VaderService.speak को कॉल कर सकता हूं, हालांकि, यदि मैं vaderService को मॉड्यूल.फैक्टरी में बदलता हूं, तो नियंत्रक में कोड अब काम नहीं करेगा , और यह मुख्य अंतर है । कारखाने के साथ, नियंत्रक को इंजेक्शन वाले VaderService को तत्काल नहीं किया जाता है, यही कारण है कि कारखाने की स्थापना करते समय आपको किसी ऑब्जेक्ट को वापस करने की आवश्यकता होती है (प्रश्न में मेरा उदाहरण देखें)।

हालांकि, आप एक ही तरह से एक सेवा स्थापित कर सकते हैं जैसे आप एक कारखाना स्थापित कर सकते हैं (आईई ने इसे ऑब्जेक्ट वापस कर दिया है) और सेवा कारखाने के समान ही व्यवहार करती है

इस जानकारी को देखते हुए, मुझे कारखाने पर सेवा का उपयोग करने का कोई कारण नहीं दिखता है, सेवा कारखाने के सब कुछ कर सकती है और बहुत कुछ कर सकती है।

नीचे मूल प्रश्न।

मुझे पता है कि यह कई बार पूछे गए हैं, लेकिन मैं वास्तव में कारखानों और सेवाओं के बीच कोई कार्यात्मक अंतर नहीं देख सकता। मैंने इस ट्यूटोरियल को पढ़ा था: http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider

और ऐसा लगता है कि एक उचित अच्छी व्याख्या है, हालांकि, मैंने अपना ऐप निम्नानुसार स्थापित किया है:

index.html

<!DOCTYPE html>
<html>
    <head>
    <title>My App</title>
    <script src="lib/angular/angular.js"></script>
    <script type="text/javascript" src="js/controllers.js"></script>
    <script type="text/javascript" src="js/VaderService.js"></script>
    <script type="text/javascript" src="js/app.js"></script>
    </head>

    <body ng-app="MyApp"> 
        <table ng-controller="StarWarsController">
            <tbody>
            <tr><td>{{luke}}</td></tr>
            </tbody>
        </table>
    </body>
</html>

app.js:

angular.module('MyApp', [
  'MyApp.services',
  'MyApp.controllers'
]);

controllers.js:

var module = angular.module('MyApp.controllers', []);

module.controller('StarWarsController', function($scope, VaderService) {
    var luke = new VaderService('luke');
    $scope.luke = luke.speak();
});

VaderService.js

var module = angular.module('MyApp.services', []);

module.factory('VaderService', function() {
    var VaderClass = function(padawan) {
        this.name = padawan;
        this.speak = function () {
            return 'Join the dark side ' + this.name;
        }
    }

    return VaderClass;
});

फिर जब मैं index.html को लोड करता हूं तो मुझे लगता है कि "अंधेरे तरफ ल्यूक में शामिल हों", बढ़िया। बिल्कुल अपेक्षित के रूप में। हालांकि अगर मैं VaderService.js को इस में बदलता हूं (मॉड्यूल.फैक्टरी के बजाय मॉड्यूल.service नोट करें):

var module = angular.module('MyApp.services', []);

module.service('VaderService', function() {
    var VaderClass = function(padawan) {
        this.name = padawan;
        this.speak = function () {
            return 'Join the dark side ' + this.name;
        }
    }

    return VaderClass;
});

फिर index.html पुनः लोड करें (मैंने सुनिश्चित किया है कि मैंने कैश खाली कर दिया है और हार्ड रीलोड किया है)। यह मॉड्यूल.फैक्टरी के साथ बिल्कुल वैसा ही काम करता है । तो दोनों के बीच असली कार्यात्मक अंतर क्या है ??


$ सेवा प्रदान करते हैं

वे तकनीकी रूप से एक ही बात हैं, यह वास्तव में $provide सेवा की provider समारोह का उपयोग करने का एक अलग संकेत है।

  • यदि आप कक्षा का उपयोग कर रहे हैं: आप सेवा नोटेशन का उपयोग कर सकते हैं।
  • यदि आप किसी ऑब्जेक्ट का उपयोग कर रहे हैं: आप फ़ैक्टरी नोटेशन का उपयोग कर सकते हैं।

service और factory नोटेशन के बीच एकमात्र अंतर यह है कि सेवा नई-एड है और कारखाना नहीं है। लेकिन बाकी सब कुछ के लिए वे दोनों देखो , गंध और व्यवहार करते हैं। दोबारा, यह $ offer.provider फ़ंक्शन के लिए सिर्फ एक शॉर्टेंड है।

// Factory

angular.module('myApp').factory('myFactory', function() {

  var _myPrivateValue = 123;

  return {
    privateValue: function() { return _myPrivateValue; }
  };

});

// Service

function MyService() {
  this._myPrivateValue = 123;
}

MyService.prototype.privateValue = function() {
  return this._myPrivateValue;
};

angular.module('myApp').service('MyService', MyService);

सेवा बनाम फैक्टरी

कारखाने और सेवा के बीच का अंतर एक समारोह और वस्तु के बीच अंतर की तरह है

फैक्टरी प्रदाता

  • हमें फ़ंक्शन का रिटर्न वैल्यू देता है यानी। आप बस एक ऑब्जेक्ट बनाते हैं, इसमें गुण जोड़ते हैं, फिर उसी ऑब्जेक्ट को वापस लौटाते हैं। जब आप इस सेवा को अपने कंट्रोलर में पास करते हैं, तो ऑब्जेक्ट पर ये गुण अब आपके फैक्ट्री के माध्यम से उस नियंत्रक में उपलब्ध होंगे। (हाइपोटेटिकल परिदृश्य)

  • सिंगलटन और केवल एक बार बनाया जाएगा

  • पुन: प्रयोज्य घटक

  • फैक्टरी डेटा साझा करने जैसे नियंत्रकों के बीच संचार के लिए एक शानदार तरीका है।

  • अन्य निर्भरताओं का उपयोग कर सकते हैं

  • आमतौर पर जब सेवा उदाहरण के लिए जटिल निर्माण तर्क की आवश्यकता होती है

  • .config() फ़ंक्शन में इंजेक्शन नहीं दिया जा सकता है।

  • गैर विन्यास योग्य सेवाओं के लिए प्रयुक्त

  • यदि आप किसी ऑब्जेक्ट का उपयोग कर रहे हैं, तो आप फैक्ट्री प्रदाता का उपयोग कर सकते हैं।

  • सिंटेक्स: module.factory('factoryName', function);

सेवा प्रदाता

  • हमें एक फ़ंक्शन (ऑब्जेक्ट) का उदाहरण देता है - आपने अभी 'नए' कीवर्ड से तुरंत चालू किया है और आप 'इस' में गुण जोड़ देंगे और सेवा 'यह' वापस कर देगी। जब आप अपने नियंत्रक में सेवा पास करते हैं, तो वे गुण 'इस' पर अब आपकी सेवा के माध्यम से उस नियंत्रक पर उपलब्ध होगा। (हाइपोटेटिकल परिदृश्य)

  • सिंगलटन और केवल एक बार बनाया जाएगा

  • पुन: प्रयोज्य घटक

  • डेटा साझा करने के लिए नियंत्रकों के बीच संचार के लिए सेवाओं का उपयोग किया जाता है

  • आप this कीवर्ड का उपयोग करके किसी सेवा ऑब्जेक्ट में गुण और फ़ंक्शंस जोड़ सकते हैं

  • निर्भरता को कन्स्ट्रक्टर तर्क के रूप में इंजेक्शन दिया जाता है

  • सरल निर्माण तर्क के लिए प्रयुक्त

  • .config() फ़ंक्शन में इंजेक्शन नहीं दिया जा सकता है।

  • यदि आप कक्षा का उपयोग कर रहे हैं तो आप सेवा प्रदाता का उपयोग कर सकते हैं

  • सिंटेक्स: module.service('serviceName', function);

नमूना डेमो

नीचे दिए गए उदाहरण में मैंने MyService और MyFactory को परिभाषित किया है। ध्यान दें कि कैसे। सेवा मैंने इस this.methodname. का उपयोग कर सेवा विधियों का this.methodname. में। .factory मैंने एक फैक्ट्री ऑब्जेक्ट बनाया है और इसे तरीकों को सौंपा है।

AngularJS। सेवा

module.service('MyService', function() {

    this.method1 = function() {
            //..method1 logic
        }

    this.method2 = function() {
            //..method2 logic
        }
});

AngularJS। फैक्टरी

module.factory('MyFactory', function() {

    var factory = {}; 

    factory.method1 = function() {
            //..method1 logic
        }

    factory.method2 = function() {
            //..method2 logic
        }

    return factory;
});

इसके अलावा इस खूबसूरत चीजें देखें

सेवा बनाम कारखाने के बारे में उलझन में

http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider

Angular.js: सेवा बनाम प्रदाता बनाम कारखाने?


  • यदि आप किसी सेवा का उपयोग करते हैं तो आपको एक फ़ंक्शन का उदाहरण मिलेगा ("यह" कीवर्ड)।
  • यदि आप एक फैक्ट्री का उपयोग करते हैं तो आपको फ़ंक्शन संदर्भ (फ़ैक्टरी में वापसी विवरण) का आविष्कार करके वापस किया जाएगा

फैक्टरी और सेवा सबसे अधिक उपयोग की जाने वाली व्यंजन हैं। उनके बीच एकमात्र अंतर यह है कि सेवा नुस्खा कस्टम प्रकार की वस्तुओं के लिए बेहतर काम करता है, जबकि फैक्टरी जावास्क्रिप्ट प्राइमेटिव्स और कार्यों का उत्पादन कर सकती है।

Reference







angularjs-factory