Mi manca ovviamente qualche concetto/comprensione e la maggior parte delle nozioni di base OO di javascript!Posso avere più istanze di un modulo RequireJS?
Mi piace usare RequireJS e la mia app Web ora sembra più un'app strutturata piuttosto che un intero mucchio di codice pazzo.
Sto solo cercando di capire come/se quanto segue è possibile.
Ho un modulo che agisce come modulo base Dataservice chiamato dataservice_base come segue:
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
};
});
Come si può vedere, sto referenziare DataServices/Dataservice, che è in realtà il meccanismo chiamata AJAX nucleo (non mostrato, ma in realtà solo una chiamata jQuery ajax di base in un wrapper).
Quello che sto cercando di fare è di permettere che questo modulo base Dataservice di essere "istanziato" come segue (all'interno di un altro modulo - snippet di codice solo):
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/');
Come potete vedere, sto cercando di includere lo stesso dataservice_base (definito sopra) per 3 volte, ma nei riferimenti di funzione, sto cercando di fare riferimento a ogni istanza da Vars nome vale a dire:
dataservice_profile, dataservice_qualifications, dataservice_subjects
.. e naturalmente sto cercando di essere in grado di impostare un valore unico setRoute per ognuna di queste istanze da utilizzare ulteriormente nel modulo .. sfruttando al contempo le chiamate comuni (get, puts, posts ecc.).
Ovviamente mi mancano alcune cose qui .. ma qualsiasi aiuto per indicarmi indietro sulla strada sarebbe molto ben accolto !!
Cordiali saluti, David.
Ero alle prese con questo concetto. Questa risposta lo rende molto chiaro! ... Suppongo che la chiave qui sia capire che RequireJS restituisce sempre la stessa istanza di un modulo, non importa quante volte lo "richieda". Se il modulo restituisce una funzione di costruzione anziché un oggetto statico, tuttavia, è possibile creare istanze dalla funzione di costruzione utilizzando la nuova parola chiave nel modulo client. La stessa funzione di costruzione viene restituita da RequireJS ogni volta, ma è quello che vogliamo perché è un modello, una classe. È compito del modulo client creare istanze da quella classe. –
"" "Suppongo che la chiave qui sia capire che RequireJS restituisce sempre la stessa istanza di un modulo, non importa quante volte lo" richieda "." "" Quasi. Memorizza nella cache la prima istanza richiesta, ma SOLO se è lo stesso modulo esatto sullo stesso percorso esatto. Questo significa che se hai la stessa lib "xxx" in 2 percorsi diversi (per le diverse parti della tua app), ad esempio: app/modules/foo/xxx e app/modules/bar/xxx, quindi richiedendo ciascuno di portare un istanza diversa. Questo può accadere per es. se hai un package.json diverso per ogni modulo e chiedono la stessa libreria. – Hejazzman