2017-09-19 6 views
1

각도 1.6.7을 사용하고 있습니다. 내 애플 리케이션에서 여러 모듈을 만들었습니다. 상위 모듈 (myApp)에 정의 된 상수 (예 : 'rootURL')를 하위 모듈 (childApp)에 전달하려면 어떻게해야합니까? 더 구체적으로 말하면, 모든 모듈에 대해 루트 디렉토리를 하드 코딩 할 필요가 없도록 childApp 구성 요소의 templateUrl에 "rootURL"의 값을 할당해야합니다. 컨트롤러 내에서 변수를 공유하는 방법을 알고 있지만 구성 요소의 정의 내에서 변수를 수행하는 방법을 알지 못한다고 생각합니다.각도 1.6 및 다중 모듈 : 모듈 및 구성 요소간에 전역 변수 공유

여기에 Plunker 데모가 있습니다. app.module.js에서 나는 상수 "config"를 정의했다. TemplateUrl : "components/child.html"대신 "child"(components/child.component.js)의 구성 요소를 정의 할 때 "config.rootURL + child.html"과 같은 것을 말할 수 있도록 할 수 있습니다. "? 우리는 상수를 사용할 필요가 없습니다.

미리 감사드립니다.

+0

글쎄, 자녀 컨트롤러의 정수를 주입 :'기능 childController (구성) {' –

답변

0

대신 templateUrl의 루트 URL 위해 스왑 인터셉터 : "구성 요소/child.html을"내가 뭔가를 말할 수 "config.rootURL + child.html"같은가?

template: '<ng-include src="getTemplateUrl()"/>', 

과 :

대신 templateUrl 당신은 templateng-include로 쓸 수

scope.getTemplateUrl = function() { 
    return config.rootURL + 'child.html'; 
}; 

Demo Plunker


,

코드 예제 :

function childController(config) { 

     this.getTemplateUrl = function(){ 
      return config.rootURL + 'child.html'; 
     }; 

     this.$onInit = function() { 
      var vm = this; 
      vm.child = { 
       "firstName": "Jack" 
      } 
     }; 
     // end of $onInit() 
    } 

    // Define component 
    var child = { 
     //templateUrl: "components/child.html" 
     template: '<ng-include src="vm.getTemplateUrl()"/>' 
     , controller: childController 
     , controllerAs: "vm" 
     , bindings: { 
      parent: "<" 
     } 
    }; 
+0

작동하는 것 같습니다. 고맙습니다. 컨트롤러 및 "VM"이 정의되기 전에 자식 구성 요소가 "VM"을 인식하고 템플릿을 해석하는 방법을 이해하지 못합니다. ' 그러나 "templateUrl : vm.getTemplateUrl + 'child.html'"시도했을 때 "VM이 정의되지 않았습니다"라는 메시지가 나타납니다 (나에게 더 의미가 있음). 알았어. –

+0

. 고마워요, @ Maxim Shoustin –

0

// app.module.js 
 
(function(){ 
 
    "use strict"; 
 

 
    var myApp = angular 
 
     .module("myApp", ["child"]); 
 

 
    myApp.constant("config", { 
 
     rootURL: "components/" 
 
     , version: "myApp1.0.0" 
 
    }) 
 
})(); 
 

 
// app.component.js 
 
(function(){ 
 

 
    "use strict"; 
 

 
    // Define controller 
 
    function mainController(){ 
 
     this.$onInit = function() { 
 
      var mainVM = this; 
 

 
      mainVM.parent = { 
 
       "lastName": "Smith" 
 
       , "firstName": "Jordan" 
 
      }; 
 
     }; 
 

 
    } 
 

 
    // Define component 
 
    var mainComponent = { 
 
     controller: mainController 
 
     , controllerAs: "mainVM" 
 
    }; 
 

 
    // Register controller and component 
 
    angular.module("myApp") 
 
     .controller("mainController", mainController) 
 
     .component("mainComponent", mainComponent); 
 

 
})(); 
 

 

 
// components/child.module.js 
 
(function(){ 
 
    "use strict"; 
 

 
    var child = angular.module("child", []); 
 

 
})(); 
 

 

 
// components/child.component.js 
 
(function(){ 
 
    "use strict"; 
 

 
    // Define controller 
 
    function childController() { 
 
     this.$onInit = function() { 
 
      var vm = this; 
 
      vm.child = { 
 
       "firstName": "Jack" 
 
      } 
 
     }; 
 
     // end of $onInit() 
 
    } 
 

 
    // Define component 
 
    var child = { 
 
     templateUrl: "components/child.html" 
 
     , controller: childController 
 
     , controllerAs: "vm" 
 
     , bindings: { 
 
      parent: "<" 
 
     } 
 
    }; 
 

 

 
    // Register controller and component 
 
    angular.module("child") 
 
     .controller("childController", childController) 
 
     .component("child", child); 
 

 
})();
<!DOCTYPE html> 
 
<html> 
 

 
    <head> 
 
    <script src="//code.angularjs.org/snapshot/angular.js"></script> 
 
    <link rel="stylesheet" href="style.css"> 
 
    <script src="app.module.js"></script> 
 
    <script src="app.component.js"></script> 
 
    <script src="components/child.module.js"></script> 
 
    <script src="components/child.component.js"></script> 
 
    </head> 
 

 
    <body ng-app="myApp" ng-controller="mainController as mainVM"> 
 
    Parent: {{mainVM.parent.firstName}} {{mainVM.parent.lastName}}<br> 
 
    <child parent="mainVM.parent"></child> 
 
    </body> 
 

 
</html> 
 

 
<!-- components/child.html --> 
 
Child: {{vm.child.firstName}} {{vm.parent.lastName}}

당신이 값이 주입-수있는 다른 모든 서비스처럼 될 것을 myApp.constant()를 사용하여 일정을 등록 할 때. 구성 요소의 컨트롤러에 삽입하여 사용할 수는 있지만 각도에 따라 이미 템플릿을 다운로드 (또는 다운로드하려고 시도)했습니다. 구성 요소를 등록 할 때 URL을 수정해야하지만 구성 요소를 등록 할 때는 주입 기능을 사용할 수 없습니다.

대신 $ http 인터셉터라는 기능을 살펴 보시기 바랍니다. 템플리트 요청을 찾고 URL을 수정하기위한 인터셉터를 작성할 수 있습니다.

https://docs.angularjs.org/api/ng/service/ $ HTTP

그때 인터셉터에서 해당 토큰을 찾아 토큰과 템플릿 URL을 쓰는 게 좋을 것. 예를 들어 :

그런 다음
templateUrl: '{tplBase}/myTemplate.html' 

그 토큰을 찾고

myApp.config(function($httpProvider) { 
    //The interceptor factory is injectable, so inject your config constant here... 
    $httpProvider.interceptors.push(function(config) { 
     return { 
      'request': function(httpConfig) { 

       if (httpConfig.url.contains('{tplBase}')) { 
        httpConfig.url = httpConfig.url.replace('{tplBase}', config.rootUrl); 
       } 
       return httpConfig; 
      } 
     }; 
    }); 
}); 
+0

감사합니다. 나는 이것을 시도 할 것이다. –