2013-01-08 4 views
6

나는 분명히 어떤 개념/이해와 가장 명확하게 자바 스크립트 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 값을 모듈에서 더 많이 사용하도록 고유 한 값을 설정할 수 있습니다.

분명히 나는 ​​여기 몇 가지를 놓치고있다. 그러나 길에서 나를 다시 지적하는 어떤 도움도 매우 감사하게 받아 들여질 것이다 !!

친절, 데이비드.

답변

6

종속성을 한 번만 포함하고 new 키워드를 사용해야한다고 생각합니다. 아마도 당신은 따라 모듈의 일반적인 기능이 너무 리팩토링해야합니다 가끔 혼자 작업

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... 
} 

이제 모든 작업이 가능합니다.

내가해야 할 유일한 다른 일은 이러한 개체가 공개되도록 프로세스를 정리하는 방법을 찾는 것입니다. 그러나 몇 가지 사항 만있을 수는 있지만 여전히 ..

덕분에 다시

+2

나는이 개념에 어려움을 겪고있었습니다. 이 대답은 매우 명확합니다! ... 여기서 핵심은 RequireJS가 모듈의 동일한 인스턴스를 반환한다는 것을 이해하는 것입니다. 아무리 많은 시간이 걸리더라도 상관 없습니다. 그러나 모듈이 정적 객체 대신 생성자 함수를 반환하면 클라이언트 모듈의 new 키워드를 사용하여 생성자 함수에서 인스턴스를 만들 수 있습니다. 동일한 생성자 함수가 매번 RequireJS에 의해 반환되지만 템플릿, 클래스이기 때문에 우리가 원하는 것입니다. 이 클래스에서 인스턴스를 생성하는 것은 클라이언트 모듈의 작업입니다. –

+0

"" "여기서 중요한 것은 RequireJS가 모듈의 동일한 인스턴스를 반환한다는 것을 이해하는 것입니다." "" 거의. 첫 번째 필수 인스턴스를 캐시하지만 동일한 정확한 경로에있는 동일한 정확한 모듈 인 경우에만 캐시합니다. app/modules/foo/xxx 및 app/modules/bar/xxx와 같은 두 가지 경로 (앱의 각기 다른 부분)에 동일한 lib "xxx"가있는 경우 각 경로마다 다른 인스턴스. 예를 들어 각 모듈마다 다른 package.json이 있고 동일한 라이브러리를 요청하는 경우 – Hejazzman

1

그냥 지금 당신은 new componentName()와 플러그인의 새로운 인스턴스를 생성 할 수 있습니다이

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

같은 객체 대신 함수를 반환 @asgoth.

관련 문제