Oczywiście brakuje mi pojęcia/zrozumienia i zdecydowanie javascript OO!Czy mogę mieć wiele instancji modułu RequireJS?
Uwielbiam używać RequireJS, a moja aplikacja internetowa wygląda teraz bardziej jak aplikacja strukturalna, a nie cała kupa zwariowanego kodu.
Po prostu staram się zrozumieć, w jaki sposób/jeśli jest to możliwe.
Mam moduł, który działa jako moduł bazowy dataservice zwanego dataservice_base następująco:
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
};
});
Jak widać, jestem przedstawieniu dataservices/dataservice, która jest faktycznie mechanizm rdzeń wywołanie AJAX (nie pokazano, ale tak naprawdę tylko podstawowe wywołanie ajax jQuery w opakowaniu).
Co staram się zrobić, to pozwolić to moduł podstawowy dataservice być „instancja” w następujący sposób (w innym module - tylko fragment kodu):
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/');
Jak widać, staram się to samo dataservice_base (zdefiniowany powyżej) 3 razy, ale w odnośnikach funkcyjnych, staram się odnieść do każdej instancji o nazwie Vars tj:
dataservice_profile, dataservice_qualifications, dataservice_subjects
.. i oczywiście próbuję ustawić unikalną wartość setRoute dla każdej z tych instancji, która będzie dalej używana w module .. przy jednoczesnym wykorzystaniu wspólnych wywołań (get, puts, posts itp.).
Oczywiście brakuje mi tu kilku rzeczy .. ale jakakolwiek pomoc, która wskazywałaby mnie na drodze, byłaby bardzo wdzięcznie przyjęta !!
Pozdrawiamy, David.
Walczyłem z tą koncepcją. Ta odpowiedź czyni ją bardzo jasną! ... Przypuszczam, że kluczem tutaj jest zrozumienie, że RequireJS zawsze zwraca to samo wystąpienie modułu, bez względu na to, ile razy "wymagacie" tego. Jeśli moduł zwraca funkcję konstruktora zamiast statycznego obiektu, można utworzyć wystąpienia z funkcji konstruktora, używając nowego słowa kluczowego w module klienta. Ta sama funkcja konstruktora jest zwracana przez RequireJS za każdym razem, ale tego właśnie chcemy, ponieważ jest to szablon, klasa. Zadaniem modułu klienta jest tworzenie instancji z tej klasy. –
"" "Przypuszczam, że kluczem tutaj jest zrozumienie, że RequireJS zawsze zwraca to samo wystąpienie modułu, bez względu na to, ile razy" wymaga "tego modułu." "" Prawie. Wykonuje buforowanie pierwszej wymaganej instancji, ale TYLKO jeśli jest to ten sam dokładny moduł na tej samej dokładnej ścieżce. Oznacza to, że jeśli masz tę samą bibliotekę "xxx" w 2 różnych ścieżkach (dla różnych części swojej aplikacji), takich jak: app/modules/foo/xxx i app/modules/bar/xxx, a następnie wymagając każdej z nich przynieść inna instancja. Może się to stać np. jeśli masz inny pakiet package.json dla każdego modułu i pytają o tę samą bibliotekę. – Hejazzman