2013-11-02 4 views
2

필자는 확장해야 할 Dojo 1.8 (AMD 스타일)로 작성된 사전 작성된 클라이언트 애플리케이션을 사용하고 있습니다.Dojo : 미리로드 된 모듈 덮어 쓰기

소스 코드에 액세스 할 수 있지만 가능한 경우 변경하지 않고 대신 덮어 쓰기 (응용 프로그램 플러그인 프레임 워크가 작동하는 방식, 해킹이되는 방식)를 선호합니다.

내 스크립트는 기본 응용 프로그램 스크립트 이후에만로드됩니다. 예를 들어 djConfig를 수정할 수 없으며 기본 응용 프로그램 모듈을로드하기 전에 발생할 수있는 사항도 수정할 수 없습니다.

여기 내 질문 : 기본 응용 프로그램 클래스 중 하나를 확장 (declare로 만든)하고 내 재정의를 전역 적으로 적용하고 싶습니다. 이미이 클래스를 포함하고있는 모듈을 필요로하는 미리로드 된 모듈에서도 (그러나 아직 그것을 인스턴스화했다).

지금까지 가장 좋은 해결책은 require()를 사용하여 클래스를 포함하는 모듈의 별명을 지정하는 것입니다. 그러나 이것은 별칭을 등록 할 수있는 클래스를 필요로하는 모듈에서만 작동합니다.

+2

가장 좋은 방법은 바로의 프로토 타입을 무시하는 것입니다 편집하려는 모듈 프로토 타입을 직접 또는 dojo.extend를 사용하여이 작업을 수행 할 수 있습니다. 또한 "dojo monkey patching"을 찾아보십시오. – tik27

답변

3

Dojo AMD Loader documentation 주 :

모듈 값 모듈 스페이스로 입력되면, 그것은 그것이 요구 될 때마다 재 계산하지 않다. 실용적인 수준에서이 은 팩토리가 한 번만 호출되고 반환 된 값은 지정된 모듈을 사용하는 모든 코드간에 캐시되고 공유 된 을 의미합니다. (참고 :. 도장 로더 모듈 값 정의를 해제 비표준 기능 require.undef을 포함한다)

이것은 당신이 모듈의 프로토 타입을 수정하는 경우, 변경도, 응용 프로그램 전체에 전파된다는 것을 의미합니다 이것이 JavaScript가 작동하는 방식이기 때문에 변경 전에 생성 된 인스턴스에 적용됩니다.

require(['App'], function(App) { 
    App.extend({ 
     run: function() { 
      // override `run` method here   
     } 
    }); 
}); 

가 직접보기 :

dojo/_base/declare 통해 생성 된 클래스의 프로토 타입을 수정하려면, extend() 생성자에 정의 된 방법이있다 http://jsfiddle.net/phusick/HxkFs/

+1

이것은 내가 찾고있는 것입니다. 고마워요! –