2013-11-21 4 views
6

मुझे एक आवश्यकता है जिसमें मुझे कारखाना लिखना चाहिए। इस कारखाने में 3 फ़ंक्शन इनिट, सेव और डिलीटएंगुलरजेएस फैक्ट्री एक ऑब्जेक्ट कैसे लौटा सकता है

मुझे नियंत्रक से इनिट फ़ंक्शन को कॉल करना चाहिए। यह फ़ंक्शन एक ऑब्जेक्ट देता है। इस ऑब्जेक्ट में फ़ंक्शन जोड़ने और हटाने के लिए फ़ंक्शन है।

मैं इसे कैसे प्राप्त कर सकता हूं?

के बाद मेरी कोड, यह सफलतापूर्वक निष्पादित किया जाता है init समारोह लेकिन जब मैं वस्तु जो ऐड में वापस आ गया था का उपयोग करें या हटाने का प्रयास है, यह कहते वस्तु रिक्त है

angularApp.factory('SomeFactory', function(){ 
var client = new Client(); // this client is defined in another javascript file 
          // this is the object which we should return 
var clientReady = function() { 
    var cv = client.GetVersion(); 
    showIDs(); 
}; 
return { 
    initClient:function(requiredUID){ 
     client.setAttribute("clientReadyCallback",clientReady); 
    }//, 

}; 
var add = function() { 
    client.someapi; 
}; 
var delete = function() { 
    client.someapi; 
};` 
}); 

in controller i call the below calls 
SomeFactory.initClient("username"); 
SomeFactory.add();// throws error 

मैं यह कैसे प्राप्त कर सकते हैं?

+0

आप कभी भी 'var add = function() ...' तक पहुंच नहीं रहे हैं क्योंकि आप इससे पहले लौट रहे हैं। – Beterraba

+0

भले ही मैं उन फ़ंक्शन को अल्पविराम से अलग करने के अंदर वापस कर दूं, फिर भी यह – user1834664

+0

काम नहीं करता है क्या आप अपना कोड एक पहेली में डाल सकते हैं? – Beterraba

उत्तर

18

सबसे पहले, आप एक कारखाना वापस नहीं कर रहे हैं, लेकिन एक सेवा। यह एक कारखाना है जो एक सेवा बनाता है, इसलिए अपने नामकरण सम्मेलन को इस तरह समायोजित करें: app.factory('someService'

आपका कोड एक गड़बड़ है और इसमें त्रुटियां हैं, इसलिए मैं आपको केवल एक सेवा ऑब्जेक्ट लौटने की मूल बातें दिखाऊंगा।

app.factory('someService', function() { 
    var someService = { //build this object however you want 
    add: function() { 

    }, 
    save: function() { 

    } 
    }; 

    return someService; //return the object 
}); //end factory 
अपने नियंत्रक में

: someService.add();

+0

आपको बहुत बहुत धन्यवाद। अब यह ठीक काम कर रहा है। – user1834664

+0

असल में यह जवाब थोड़ा सा है। एक वस्तु को वापस करना वास्तव में एक कारखाना है, सेवा नहीं। किसी ऑब्जेक्ट को लौटने से कारखाने को एक नया उदाहरण तैयार करने की अनुमति मिलती है, यानी इसे नया किया जा सकता है, जिससे आपको एक इंजेक्शन स्रोत से सेवा की कई प्रतियां उत्पन्न करने की क्षमता मिलती है। विवरण के लिए यह आलेख देखें: http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/ या इस प्रश्न में मेरा उत्तर –

+1

आप जो भी कहा उससे अलग कुछ नहीं कह रहे हैं । आप 'नया' के साथ एक नया उदाहरण बनाने के बारे में एक अतिरिक्त विवरण जोड़ रहे हैं। जिस तरह से मैं इसके बारे में सोचता हूं, वह कोणीय से संबंधित नहीं है। आप सेवा के इंजेक्शन मूल्य पर काम कर सकते हैं हालांकि आप चाहते हैं। आपके उत्तर के अनुसार, 'var instanceOne = new $ factory;' सटीक नामकरण नहीं है। एक कारखाना एक ऐसा कार्य है जो कुछ बनाता है। आपके उदाहरण में '$ फैक्ट्री 'फैक्ट्री,' सेवा 'द्वारा बनाई गई थी। – m59

2

यह एक वास्तविक परियोजना से एक Authentification कारखाने

//factory using firebase Athentication service 
 
myApp.factory('Authentication', function($firebase,$firebaseAuth,$location){ 
 

 
\t var ref = new Firebase("URL_to_firebase"); 
 
    var simpleLogin = $firebaseAuth(ref); 
 

 
    var myObject = { 
 
    \t //user is the data from the FORM 
 
    \t login : function(user){ 
 
    \t \t return simpleLogin.$authWithPassword({ 
 
\t \t \t email: user.email, 
 
\t \t \t password: user.password 
 
\t \t \t }); 
 
    \t }//login 
 
    }//password 
 

 
    return myObject;//factory should return something 
 

 
}); 
 

 
//and then you call like this in your controller 
 
myApp.controller('myController' , function($scope, $location, $firebaseAuth,Authentication){ 
 
\t 
 
\t $scope.login = function() { 
 
\t \t Authentication.login($scope.user) 
 
\t } //login 
 

 
\t 
 
});

1

एक कारखाने और सेवा वास्तव में एक सरल अलग हैं लेकिन बहुत, बहुत महत्वपूर्ण तरीका है।

फैक्टरी सेवाएं लौटाती हैं जिन्हें नया किया जा सकता है।

दूसरे शब्दों में, आप यह कर सकते हैं:

var instanceOne = new $factory; 
var instanceTwo = new $factory; 

... और फिर उन्हें अलग संस्थाओं के रूप में कहते हैं। वास्तव में यह कारखाना पैटर्न क्या है।

यहाँ एक कारखाना है कि आप की प्रतियां प्राप्त कर सकते हैं का एक सरल उदाहरण है ...

app.factory('myFactory', function() { 
    return { 
     talk: function(what) { 
      return "Say " + what; 
     } 
    } 
}); 

आप चाहते हैं तो इसके बजाय एक सेवा, आप this.methodName से इसके अंदर तरीकों को संदर्भित करने के लिए, तो जरूरत है आप बस सेवा को वापस कर रहे हैं, या, एक सिंगलटन पैटर्न। इस तरह ...

app.service('myService', function() { 
    this.talk = function(what) { 
     return "Say " + what; 
    }; 
}); 

एक साइड नोट के रूप में; यदि आप मेरे कोड को देखते हैं, तो कोणीय अब सेवा कीवर्ड, या फैक्ट्री कीवर्ड के माध्यम से वास्तव में परिभाषित सेवाओं का समर्थन करता है। स्रोत में, आप देख सकते हैं कि वे दोनों सचमुच एक ही कोड का संदर्भ देते हैं।

इसी तरह वे समान हैं, और वास्तव में ये दो कारखाने और सेवा विधियां एक दूसरे के बदले में हैं, इसलिए, यदि आप पहले उलझन में हैं, तो इसे पसीना न करें; लगभग कोई अंतर नहीं है ... लगभग :)

...बहुत से लोग जानना चाहते हैं: "आप एक कारखाना या सेवा कैसे वापस कर सकते हैं जिसमें सिर्फ एक कार्य है, यानी, यह स्वयं ही कार्य है?" आसान .. इस तरह ...

app.factory('myFactory', function() { 
    return function(what) { 
      return "Say " + what; 
    } 
}); 
संबंधित मुद्दे