다시 열고 이미 부트 스트랩 된 애플리케이션에 종속성 추가


89

이미 부트 스트랩 된 각도 모듈에 늦은 종속성을 주입하는 방법이 있습니까? 제가 의미하는 바는 다음과 같습니다.

다음과 같이 정의 된 사이트 전체 각도 앱이 있다고 가정합니다.

// in app.js
var App = angular.module("App", []);

그리고 모든 페이지에서 :

<html ng-app="App">

나중에 현재 페이지의 요구 사항에 따라 논리를 추가하기 위해 앱을 다시 엽니 다.

// in reports.js
var App = angular.module("App")
App.controller("ReportsController", ['$scope', function($scope) {
  // .. reports controller code
}])

이제 (같은 논리의 그 주문형 비트의 하나는 자신의 의존성을 필요로 말을 ngTouch, ngAnimate, ngResource, 등). 기본 앱에 어떻게 연결할 수 있습니까? 이것은 작동하지 않는 것 같습니다.

// in reports.js
var App = angular.module("App", ['ui.event', 'ngResource']); // <-- raise error when App was already bootstrapped

나는 내가 모든 것을 미리 할 수 ​​있다는 것을 알고있다.

// in app.js
var App = angular.module("App", ['ui.event', 'ngResource', 'ngAnimate', ...]);

또는 모든 모듈을 자체적으로 정의한 다음 모든 것을 기본 앱에 삽입합니다 ( 자세한 내용은 여기 참조 ).

// in reports.js
angular.module("Reports", ['ui.event', 'ngResource'])
.controller("ReportsController", ['$scope', function($scope) {
  // .. reports controller code
}])

// in home.js
angular.module("Home", ['ngAnimate'])
.controller("HomeController", ['$scope', '$http', function($scope, $http){
  // ...
}])

// in app.js, loaded last into the page (different for every page that varies in dependencies)
var App = angular.module("App", ['Reports', 'Home'])

하지만 이렇게하려면 현재 페이지의 종속성으로 매번 앱을 초기화해야합니다.

나는 기본을 포함하는 것을 선호 app.js모든 페이지를 간단하게 각 페이지 (에 필요한 확장을 도입 reports.js, home.js는 I 추가 부트 스트랩 로직마다 또는 제거 뭔가를 수정하지 않고, 등).

앱이 이미 부트 스트랩되었을 때 종속성을 도입하는 방법이 있습니까? 이를 수행하는 관용적 방법 (또는 방법)은 무엇입니까? 나는 후자의 해결책에 기대고 있지만 내가 설명한 방식이 또한 수행 될 수 있는지보고 싶었다. 감사.


마지막 작업 코드를 알려 주시겠습니까?
Mangu Singh Rajpurohit 2015

@ user2393267 mmm, 너무 오래되었습니다. 아직 해당 코드가 있는지 모르겠습니다 ... 죄송합니다. 나는 결국 디자인을 재검토했다고 생각한다. 왜냐하면 일반적으로 내가 무언가를 해킹해야 할 때 그것은 내가 제대로하고 있지 않다는 것을 의미하기 때문이다. 그러나 당신이 여전히이 접근법을 추구하기로 결심했다면, 아래 대답 은 좋은 리드처럼 보인다 .
sa125

답변:


115

다음과 같이 해결했습니다.

앱을 다시 참조하십시오.

var app = angular.module('app');

그런 다음 새 요구 사항을 요구 사항 배열로 푸시합니다.

app.requires.push('newDependency');

3
이것은 나를 위해 작동합니다 +1 나는 app.requires.push ( 'doctorCtrl', 'doctorService');와 같은 여러 종속성에 이것을 사용했습니다.
Amir

8
이것은 내 아키텍처를 구했습니다.
사이드 Neamati

3
나를 위해 작동하지 않습니다. 설명대로 종속성을 동적으로 추가하고 있지만 Angular는 여전히 추가 된 모듈에서 서비스를 찾을 수 없습니다.
Slava Fomin II

6
그리고 app.requires배열이므로 여러 종속성을 추가 하는 경우 (보고서 예제에서와 같이) push메서드에 별도의 인수로 전달 app.requires.push('ui.event', 'ngResource');하거나 추가 종속성이 이미 배열 인 경우 :Array.prototype.push.apply(app.requires, ['ui.event', 'ngResource'])
The Red Pea

2
나는 때때로 로그인하고 싶지 않기 때문에 투표를 건너 뛰고 있습니다. 감사!
CularBytes

12

단순 ... 다음과 같은 getter를 사용하여 모듈의 인스턴스를 가져옵니다. var app = angular.module ( "App");

그런 다음 다음과 같이 "requires"컬렉션에 추가합니다. app.requires [app.requires.length] = "ngResource";

어쨌든 이것은 나를 위해 일했습니다. 행운을 빕니다!


4
그것은 나를 위해 일했습니다! 질문이 있습니다. 사용하지 않는 이유 : app.requires.push ( "ngResource")?
Philipp Munin


4

한 번에 여러 종속성을 추가하려는 경우 다음과 같이 푸시로 전달할 수 있습니다.

<script>
    var app = angular.module('appName');
    app.requires.push('dependencyCtrl1', 'dependencyService1');
</script>

4

나는 이것이 오래된 질문이라는 것을 알고 있지만 아직 유효한 답변이 제공되지 않았기 때문에 어떻게 해결했는지 공유하기로 결정했습니다.

이 솔루션에는 Angular 분기가 필요하므로 더 이상 CDN을 사용할 수 없습니다. 그러나 수정이 매우 적기 때문에 Angular 에이 기능이 존재하지 않는 이유에 놀랐습니다.

이 질문에 대한 다른 답변 중 하나에 제공된 Google 그룹 링크를 따라갔습니다 . 문제를 해결 한 다음 코드를 찾았습니다.

instanceInjector.loadNewModules = function (mods) {
  forEach(loadModules(mods), function(fn) { instanceInjector.invoke(fn || noop); });
};

이 코드를 각도 1.5.0 소스 코드의 4414 행에 추가했을 때 ( createInjector함수 내부 , return instanceInjector;명령문 앞 ) 이와 같이 부트 스트랩 후 종속성을 추가 할 수있었습니다 $injector.loadNewModules(['ngCookies']);.


? 가장 많이 득표 한 답변 (2017 년 6 월 26 일 기준) 의 문제점은 무엇입니까 ? 이 글을 게시하기 1 년 이상 전에 제공된 것 같습니다. 귀하의 답변에 이점이 있습니까?
레드 완두콩

@TheRedPea 음, 내 문제가 해결되지 않았다는 점을 제외하고는 문제가 없습니다.하지만이 답변은 해결되었습니다
tjespe

그리고 그것은 당신에게 효과가 없었습니다. 왜냐하면 당신은 이미 당신의 앱을 부트 스트랩했기 때문입니까? 나는 ... 그것도 관찰
레드 완두콩에게

2
링크 된 Google 커뮤니티 게시물을 읽은 후 부트 스트랩이 이와 같은 솔루션이 필요한 이유라고 확신합니다. 원래 질문이 "이미 부트 스트랩 된 응용 프로그램"에 대해 물었 기 때문에 투표하기 때문에 다른 사람이 처리하지 않습니다 (실제로 OP가 잘못 말했을 수 있음)
The Red Pea

1

버전 1.6.7부터 이제 .NET을 사용하여 앱을 부트 스트랩 한 후 모듈을 지연로드 할 수 있습니다 $injector.loadNewModules([modules]). 다음은 AngularJS 문서에서 가져온 예입니다.

app.factory('loadModule', function($injector) {
   return function loadModule(moduleName, bundleUrl) {
     return getScript(bundleUrl).then(function() { $injector.loadNewModules([moduleName]); });
   };
})

주위에 몇 가지 문제가 있으므로 loadNewModules에 대한 전체 문서를 읽으 십시오.

ui-router와 함께 사용하는 omkadiri 의 아주 좋은 샘플 앱 도 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.