2014-07-03 15 views
7

के साथ ऑब्जेक्ट ओरिएंटेड दृष्टिकोण ऐसा लगता है कि कोणीय गुणों और विधियों के साथ कक्षा के उदाहरणों को परिभाषित करने के लिए एक अंतर्निहित समाधान प्रदान नहीं करता है और यह डेवलपर इसे बनाने के लिए तैयार करता है।AngularJS

आपकी राय में ऐसा करने का सबसे अच्छा अभ्यास क्या है? बैकएंड के साथ इसे कैसे लिंक करें?

मैंने एकत्रित कुछ युक्तियों में फैक्ट्री सेवाओं और नामित कार्यों का उपयोग किया है।

सूत्रों का कहना है: Tuto 1 Tuto 2

अपनी अंतर्दृष्टि

उत्तर

7

मुझे लगता है कि एक वस्तु यह शायद एक factory है, कई कारणों से के सबसे करीब संरचना:

बेसिक सिंटेक्स:

.factory('myFactory', function (anInjectable) { 

    // This can be seen as a private function, since cannot 
    // be accessed from outside of the factory 
    var privateFunction = function (data) { 
    // do something 
    return data 
    } 

    // Here you can have some logic that will be run when 
    // you instantiate the factory 
    var somethingUseful = anInjectable.get() 
    var newThing = privateFunction(somethingUseful) 

    // Here starts your public APIs (public methods) 
    return { 
    iAmTrue: function() { 
     return true 
    }, 

    iAmFalse: function() { 
     return false 
    }, 

    iAmConfused: function() { 
     return null 
    } 
    } 
}) 

और फिर आप एक मानक वस्तु की तरह उपयोग कर सकते हैं:

var obj = new myFactory() 

// This will of course print 'true' 
console.log(obj.iAmTrue()) 

उम्मीद है कि यह मदद करता है, मुझे पूरी तरह से पता है कि कोणीय मॉड्यूल के साथ पहला प्रभाव बहुत तीव्र हो सकता है ...

+0

यह लागू करने में आसान लगता है; यह किसी भी तरह से स्क्वामा को जोड़ने के लिए सही होगा जो मैंने नोड पक्ष पर मोन्गोज के साथ परिभाषित किया है ताकि मुझे उन गुणों को प्राप्त किया जा सके जहां से उन्हें फिर से लिखने के बजाय परिभाषित किया गया हो और उन्हें कोणीय सेवा से तरीकों से जोड़ दिया जाए। मैं ngResource के बारे में सोच रहा था लेकिन कामकाजी मामले में सफल नहीं रहा है। क्या यह समझ में आता है? – vonwolf

+0

मुझे इसके बारे में निश्चित नहीं है। ऐसा लगता है कि ऐसा करके (और मुझे नहीं पता कि यह संभव है या नहीं) आप फ्रंटेंड और बैकएंड को जोड़े जाने की कोशिश कर रहे हैं। अंगूठे के नियम के रूप में, अधिक decoupled, बेहतर। वैसे भी, 'ngResource'' $ http' संसाधन के लिए सिर्फ एक रैपर है, जिसे मैं व्यक्तिगत रूप से पसंद नहीं करता हूं। – domokun

+0

@domokun आपके मामले में 'नया myFactory()' कैसे काम करता है? कारखाना एक वस्तु देता है, इसलिए आप सामान्य रूप से उस पर 'नया ...() 'नहीं कह सकते हैं। क्या आप कुछ अतिरिक्त चालबाजी कर रहे हैं? मुझे लगता है कि 'ऑब्जेक्ट फ़ंक्शन नहीं है' चल रहा है। – Lycha

1

आप एक कोणीय सेवा का प्रयोग करेंगे के लिए धन्यवाद।

सभी कोणीय सेवाएं सिंगलेट हैं और किसी भी नियंत्रक में इंजेक्शन दी जा सकती हैं।

आदर्श रूप से आप अपने नियंत्रक में केवल HTML पर बाध्यकारी/क्रियाएं रखेंगे और शेष तर्क आपकी सेवा में होगा।

उम्मीद है कि इससे मदद मिलती है।

1

मैं इस पुस्तकालय का मूल्यांकन करके विचार आया: https://github.com/FacultyCreative/ngActiveResource

हालांकि इस पुस्तकालय सख्त बाकी मान लिया गया है तो मैं यह मेरे लिए काम नहीं किया गया था। क्या के लिए काम किया है यह है:

मैं आधार मॉडल बनाया

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

    app .factory('Model', function(){ 
     var _cache = {}; // holding existing instances 
     function Model() { 
      var _primaryKey = 'ID', 
       _this = this; 

       _this.new = function(data) { 
       // Here is factory for creating instances or 
       // extending existing ones with data provided 
       } 

     } 

     return Model; 
}); 

से मैं साधारण समारोह एक्सटेंशन ले लिया "विरासत"

Function.prototype.inherits = function (base) { 
     var _constructor; 
     _constructor = this; 
     return _constructor = base.apply(_constructor); 
    }; 

और अब मैं इस

की तरह मेरे मॉडल बनाने कैम
app.factory('Blog', [ 
    'Model', 
    '$http', 
    function(Model, $http) { 
    function Blog() { 
     // my custom properties and computations goes here 
     Object.defineProperty(this, 'MyComputed' , { 
     get: function() { return this.Prop1 + this.Prop2 } 
     }); 
    } 

    // Set blog to inherits model 
    Blog.inherits(Model); 

    // My crud operations 

    Blog.get = function(id) { 
    return $http.get('/some/url', {params: {id:id}}).then(function(response) { 
     return Blog.new(response.data); 
    }); 
    } 

    return Blog; 

    } 
]); 

अंत में, इसे contr में उपयोग करके oller

app.controller('MyCtrl', [ 
    '$scope', 'Blog', 
    function($scope, Blog) { 
     Blog.get(...).then(function(blog) { 
     $scope.blog = blog; 
     }); 
    } 
]) 

अब, हमारे मॉडल और एक्सटेंशन में बहुत कुछ है लेकिन यह एक मुख्य सिद्धांत होगा। मैं दावा नहीं कर रहा हूं कि यह सबसे अच्छा तरीका है लेकिन मैं बहुत बड़ा ऐप काम कर रहा हूं और यह वास्तव में मेरे लिए बहुत अच्छा काम करता है।

नोट: कृपया ध्यान दें कि मैंने यह कोड यहां टाइप किया है और कुछ त्रुटियां हो सकती हैं लेकिन मुख्य सिद्धांत यहां है।

0

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

क्या मैं यहाँ क्या करना चाहते हैं कैसे रूप में जानकारी प्रदर्शित करने के लिए (उदाहरण के लिए 'अंतिम नाम' के बजाय 'उपनाम')

तो मॉडल क्षेत्रों और सबसे महत्वपूर्ण बात युक्त एनजी-दोहराने के माध्यम से एक फार्म का निर्माण करना है जैसा कि मैंने मोंगोज़ मॉडल के साथ काम करना शुरू किया है, मैंने जो किया है, वह है:

सबसे पहले, निम्नलिखित प्रतिक्रिया के साथ एक app.get अनुरोध के साथ नोड पक्ष से कोणीय पक्ष में मॉडल के मोंगोस स्कीमा को पार करना संभव है:

res.send(mongoose.model('resources').schema.paths); 

यह किसी ऑब्जेक्ट को 'संसाधन' संग्रह के सभी फ़ील्ड वाले स्पिट करता है।

var resourceSchema = new Schema({ 
    _id: { type: Number }, 
    firstname: { type: String, display:'First name' }, 
    lastname: { type: String, display:'Last name' } 
}); 

mongoose.model('resources', resourceSchema); 

तो बुनियादी तौर पर मैं संतुलित कोणीय पक्ष पर इस प्राप्त कर सकते हैं और मैं सभी मैं क्षेत्रों के नक्शे और उन्हें अच्छी तरह से प्रदर्शित करने के लिए की जरूरत है: उस के शीर्ष पर मैं इस तरह के मॉडल में कुछ अतिरिक्त जानकारी भी शामिल है। ऐसा लगता है कि मैं सत्यापन का भी वर्णन कर सकता हूं लेकिन मैं अभी तक नहीं हूं।

इस दृष्टिकोण पर कोई रचनात्मक प्रतिक्रिया (चाहे वह मान्य है या पूरी तरह से विचलित है) की सराहना की जाती है।