나는 분명히 어떤 개념/이해와 가장 명확하게 자바 스크립트 OO 기초가 빠져있다!RequireJS 모듈의 인스턴스를 여러 개 가질 수 있습니까?
저는 RequireJS를 사용하여 매우 좋아합니다. 내 웹 앱은 지금 미친 코드의 전체 힙보다는 구조화 된 앱처럼 보입니다.
다음과 같은 방법이 가능한지 이해하는 데 어려움이 있습니다.
나는 dataservice_base로 불리는 기본 DataService의 모듈 역할을하는 모듈을 다음과 같습니다 당신이 볼 수 있듯이, 나는 (실제로는 핵심 AJAX 호출 메커니즘입니다 DataServices에/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
};
});
표시되지 않지만 실제로 래퍼에서 기본 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의 모듈 (전용 코드 조각은 다른 모듈 내에서) 다음과 같이 "복제 된"할 수있다 같은 dataservice_base 3 번 (위의 정의)하지만, 함수 참조에, 나는 이름 바르 각 인스턴스를 참조하는 것을 시도하고있다가, 즉 :
dataservice_profile이 dataservice_qualifications는, 을 dataservice_subjects.. 물론 공통적 인 호출 (get, puts, posts 등)을 활용하면서 각 인스턴스에 대해 setRoute 값을 모듈에서 더 많이 사용하도록 고유 한 값을 설정할 수 있습니다.
분명히 나는 여기 몇 가지를 놓치고있다. 그러나 길에서 나를 다시 지적하는 어떤 도움도 매우 감사하게 받아 들여질 것이다 !!
친절, 데이비드.
나는이 개념에 어려움을 겪고있었습니다. 이 대답은 매우 명확합니다! ... 여기서 핵심은 RequireJS가 모듈의 동일한 인스턴스를 반환한다는 것을 이해하는 것입니다. 아무리 많은 시간이 걸리더라도 상관 없습니다. 그러나 모듈이 정적 객체 대신 생성자 함수를 반환하면 클라이언트 모듈의 new 키워드를 사용하여 생성자 함수에서 인스턴스를 만들 수 있습니다. 동일한 생성자 함수가 매번 RequireJS에 의해 반환되지만 템플릿, 클래스이기 때문에 우리가 원하는 것입니다. 이 클래스에서 인스턴스를 생성하는 것은 클라이언트 모듈의 작업입니다. –
"" "여기서 중요한 것은 RequireJS가 모듈의 동일한 인스턴스를 반환한다는 것을 이해하는 것입니다." "" 거의. 첫 번째 필수 인스턴스를 캐시하지만 동일한 정확한 경로에있는 동일한 정확한 모듈 인 경우에만 캐시합니다. app/modules/foo/xxx 및 app/modules/bar/xxx와 같은 두 가지 경로 (앱의 각기 다른 부분)에 동일한 lib "xxx"가있는 경우 각 경로마다 다른 인스턴스. 예를 들어 각 모듈마다 다른 package.json이 있고 동일한 라이브러리를 요청하는 경우 – Hejazzman