2013-01-08 5 views
6

मुझे स्पष्ट रूप से कुछ अवधारणा/समझ याद आ रही है और सबसे निश्चित रूप से जावास्क्रिप्ट ओओ मूल बातें!क्या मेरे पास आवश्यकताजेएस मॉड्यूल के कई उदाहरण हो सकते हैं?

मैं RequJS का उपयोग करके प्यार करता हूं, और मेरा वेब ऐप अब पागल कोड के पूरे ढेर के बजाय एक संरचित ऐप की तरह दिखता है।

मैं समझने के लिए संघर्ष कर रहा हूं कि निम्नलिखित कैसे संभव है।

मैं एक मॉड्यूल जो dataservice_base के रूप में बुलाया एक आधार dataservice मॉड्यूल के रूप में कार्य करता है इस प्रकार है:

define(['dataservices/dataservice'], function (dataservice) { 

    // Private:  Route URL 
    this.route = '/api/route-not-set/'; 
    var setRoute = function (setRoute) { 
     this.route = setRoute; 
     return; 
    } 

    // Private: Return route with/without id 
    var routeUrl = function (route, id) { 
     console.log('** Setting route to: ' + route); 
     return route + (id || "") 
    } 

    // Private: Returns all entities for given route 
    getAllEntities = function (callbacks) { 
     return dataservice.ajaxRequest('get', routeUrl()) 
     .done(callbacks.success) 
     .fail(callbacks.error) 
    }; 

    getEntitiesById = function (id, callbacks) { 
     return dataservice.ajaxRequest('get', routeUrl(this.route, id)) 
     .done(callbacks.success) 
     .fail(callbacks.error) 
    }; 

    putEntity = function (id, data, callbacks) { 
     return dataservice.ajaxRequest('put', routeUrl(this.route, id), data) 
     .done(callbacks.success) 
     .fail(callbacks.error) 
    }; 

    postEntity = function (data, callbacks) { 
     return dataservice.ajaxRequest('post', routeUrl(this.route), data) 
     .done(callbacks.success) 
     .fail(callbacks.error) 
    }; 

    deleteEntity = function (id, data, callbacks) { 
     return dataservice.ajaxRequest('delete', routeUrl(this.route, id), data) 
     .done(callbacks.success) 
     .fail(callbacks.error) 
    }; 

    // Public:  Return public interface 
    return { 
     setRoute: setRoute, 
     getAllEntities: getAllEntities, 
     getEntitiesById: getEntitiesById, 
     putEntity: putEntity, 
     postEntity: postEntity, 
     deleteEntity: deleteEntity 
    }; 

}); 

आप देख सकते हैं, मैं संदर्भित हूँ dataservices/dataservice, जो वास्तव में कोर AJAX कॉल तंत्र है (दिखाया नहीं गया है, लेकिन वास्तव में सिर्फ एक मूलभूत jQuery AJAX कॉल एक रैपर में)।

define(['dataservices/dataservice_base', 'dataservices/dataservice_base', 'dataservices/dataservice_base'], function (dataservice_profile, dataservice_qualifications, dataservice_subjects) { 

    // Set the service route(s) 
    dataservice_profile.setRoute('/api/profile/'); 
    dataservice_qualifications.setRoute('/api/qualification/'); 
    dataservice_subjects.setRoute('/api/subject/'); 

आप देख सकते हैं, मैं शामिल करने के लिए कोशिश कर रहा हूँ: -

मुझे क्या करना कोशिश कर रहा हूँ इस आधार dataservice मॉड्यूल "instanced" इस प्रकार है (केवल स्निपेट कोड एक और मॉड्यूल के भीतर) होने की अनुमति है एक ही dataservice_base (ऊपर परिभाषित) 3 बार, लेकिन समारोह के संदर्भ में, मैं नामित वार्स द्वारा प्रत्येक उदाहरण का उल्लेख करने के कोशिश कर रहा हूँ अर्थात्:

dataservice_profile, dataservice_qualifications, dataservice_subjects

.. और निश्चित रूप से मैं मॉड्यूल में आगे का उपयोग करने के लिए उन सभी उदाहरणों के लिए एक अद्वितीय setRoute मान सेट करने में सक्षम होने का प्रयास कर रहा हूं .. सामान्य कॉल (प्राप्त, रखता है, पोस्ट आदि) का लाभ उठाने के दौरान।

जाहिर है, मुझे यहां कुछ चीजें याद आ रही हैं .. लेकिन मुझे सड़क पर वापस इंगित करने में कोई मदद बहुत आभारी रूप से प्राप्त की जाएगी !!

दयालु सम्मान, डेविड।

उत्तर

6

मुझे लगता है कि आपको केवल एक बार अपनी निर्भरता शामिल करने और new कीवर्ड का उपयोग करने की आवश्यकता है। संभवत: आप एक आधार मॉड्यूल में इतना refactor करने के लिए है कि आम कार्य हैं की आवश्यकता होगी: अकेले कभी कभी काम करने का

define(['dataservices/dataservice'], function (dataservice) { 
    var dataservice_profile = new dataservice(); 
    var dataservice_qualifications = new dataservice(); 
    var dataservice_subjects = new dataservice(); 

    // Set the service route(s) 
    dataservice_profile.setRoute('/api/profile/'); 
    dataservice_qualifications.setRoute('/api/qualification/'); 
    dataservice_subjects.setRoute('/api/subject/'); 

    // define needs to return something 
    return { 
     profile: dataservice_profile, 
     qualifications: dataservice_qualifications, 
     subjects: dataservice_subjects 
    }; 
}); 
3

हाँ, मस्तिष्क फ्रीज या जो कुछ भी .. समस्याओं!

तो, जैसा कि @asgoth का उल्लेख किया गया है, काफी हद तक मेरे दिमाग को साफ़ करना और चीजों को थोड़ा सा सोचना पड़ा!

इस प्रकार मैं फिर से कारक dataservice_base मॉड्यूल के साथ समाप्त हो गया:

define(['dataservices/dataservice'], function (dataservice) { 

    // Set any class/static vars 

    // Set the instance function 
    function dataservice_base(setRoute) { 

     var self = this; 

     self.route = setRoute; 
     console.log('setting route: ' + self.route); 

     function routeUrl(route, id) { 
      console.log('** Setting route to: ' + route); 
      return route + (id || "") 
     } 

     self.getAllEntities = function (callbacks) { 
      return dataservice.ajaxRequest('get', routeUrl()) 
      .done(callbacks.success) 
      .fail(callbacks.error) 
     } 

     self.getEntitiesById = function (id, callbacks) { 
      return dataservice.ajaxRequest('get', routeUrl(self.route, id)) 
      .done(callbacks.success) 
      .fail(callbacks.error) 
     } 

     self.putEntity = function (id, data, callbacks) { 
      return dataservice.ajaxRequest('put', routeUrl(self.route, id), data) 
      .done(callbacks.success) 
      .fail(callbacks.error) 
     } 

     self.postEntity = function (data, callbacks) { 
      return dataservice.ajaxRequest('post', routeUrl(self.route), data) 
      .done(callbacks.success) 
      .fail(callbacks.error) 
     } 

     self.deleteEntity = function (id, data, callbacks) { 
      return dataservice.ajaxRequest('delete', routeUrl(self.route, id), data) 
      .done(callbacks.success) 
      .fail(callbacks.error) 
     } 

    } // eof instance 

    return dataservice_base; 
} 

और निश्चित रूप से फिर से @asgoth उल्लेख किया, मैं केवल करने के लिए निश्चित रूप से dataservice_base मॉड्यूल के लिए एक संदर्भ है, और यह उदाहरण में शामिल हैं की जरूरत है मेरी आवश्यकताओं के लिए निम्नानुसार है:

define(['dataservices/dataservice_base','viewmodels/viewmodel_profile', 'viewmodels/viewmodel_qualifications', 'viewmodels/viewmodel_subjects', 'app/common'], function (dataservice_base, viewmodel_profile, viewmodel_qualifications, viewmodel_subjects, common) { 

    var dataservice_profile = new dataservice_base('/api/profile/'); 
    var dataservice_qualifications = new dataservice_base('/api/qualification/'); 
    var dataservice_subjects = new dataservice_base('/api/subject/'); 

    // do whatever now with those instance objects... 
} 

SO .. अब सभी काम कर रहे हैं!

मुझे लगता है कि मुझे केवल एक और चीज की आवश्यकता है जो इन वस्तुओं को जारी करने के लिए प्रक्रिया को साफ करने के बारे में सोच रहा है .. हालांकि वहां केवल कुछ ही होंगे .. लेकिन फिर भी ..

धन्यवाद फिर से @asgoth

+2

मैं इस अवधारणा के साथ संघर्ष कर रहा था। यह जवाब यह बहुत स्पष्ट बनाता है! ... मुझे लगता है कि यहां कुंजी यह समझना है कि RequJS हमेशा एक मॉड्यूल का एक ही उदाहरण देता है, इससे कोई फर्क नहीं पड़ता कि आपको कितनी बार "आवश्यकता" है। यदि आपका मॉड्यूल एक स्थिर ऑब्जेक्ट के बजाय एक कन्स्ट्रक्टर फ़ंक्शन देता है, तो आप क्लाइंट मॉड्यूल में नए कीवर्ड का उपयोग करके कन्स्ट्रक्टर फ़ंक्शन से उदाहरण बना सकते हैं। वही कन्स्ट्रक्टर फ़ंक्शन हर बार RequJS द्वारा वापस किया जाता है, लेकिन यही वह है जिसे हम चाहते हैं क्योंकि यह एक टेम्पलेट है, एक वर्ग है। यह उस वर्ग से उदाहरण बनाने के लिए क्लाइंट मॉड्यूल का काम है। –

+0

"" मुझे लगता है कि यहां कुंजी यह समझना है कि RequJS हमेशा एक मॉड्यूल का एक ही उदाहरण देता है, इससे कोई फर्क नहीं पड़ता कि आपको कितनी बार "आवश्यकता है"। "" लगभग। यह पहला आवश्यक उदाहरण कैश करता है, लेकिन केवल तभी यदि यह एक ही सटीक पथ पर एक ही सटीक मॉड्यूल है। इसका मतलब है कि यदि आपके पास 2 अलग-अलग पथों (अलग-अलग हिस्सों के लिए आपके ऐप) में समान lib "xxx" है, जैसे: ऐप/मॉड्यूल/foo/xxx और ऐप/मॉड्यूल/बार/xxx, तो प्रत्येक को लाने के दौरान प्रत्येक की आवश्यकता होती है अलग उदाहरण ऐसा हो सकता है उदा। यदि आपके पास प्रत्येक मॉड्यूल के लिए एक अलग पैकेज.जेसन है, और वे एक ही पुस्तकालय के लिए पूछते हैं। – Hejazzman

1

बस इस

return function(){ 
    return { 
     // your public interface goes here 
    }; 
} 

की तरह, जो फ़ंक्शन रिटर्न एक वस्तु के स्थान पर अब आप new componentName() के साथ अपने प्लगइन का नया उदाहरण बना सकते हैं।

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

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