한 페이지에 두 개의 각도 앱 / 모듈을 정의하는 방법은 무엇입니까?


118

한 페이지에 두 개의 각도 앱 / 모듈을 추가하려고합니다. 아래의 바이올린에서 html 코드에서 참조되는 첫 번째 모듈 만 올바르게 작동하는 반면 두 번째 모듈은 angular에서 인식되지 않음을 알 수 있습니다.

바이올린 에서는 doSearch2메서드 만 실행할 수 있지만이 바이올린 에서는 doSearch메서드 만 올바르게 작동합니다.

두 개의 각도 모듈을 한 페이지에 올바르게 배치하는 방법을 찾고 있습니다.

답변:


123

HTML 문서 당 하나의 AngularJS 애플리케이션 만 자동 부트 스트랩 될 수 있습니다. 문서에서 발견 된 첫 번째 ngApp은 애플리케이션으로 자동 부트 스트랩 할 루트 요소를 정의하는 데 사용됩니다. HTML 문서에서 여러 응용 프로그램을 실행하려면 대신 angular.bootstrap을 사용하여 수동으로 부트 스트랩해야합니다. AngularJS 애플리케이션은 서로 중첩 될 수 없습니다. -http : //docs.angularjs.org/api/ng.directive : ngApp

또한보십시오


@MarkRajcok 그렇다면 HTML 문서 당 하나의 모듈 만 갖는 것이 좋은 습관입니까? 메인 AngularJS 페이지 세트의 "Wire up a Backend"예제 ng-app="project"는 "이렇게하면 페이지의 다른 부분에서 실행되는 모듈을 가질 수 있습니다"라고 말하지만 ngApp 문서에는 "HTML 문서 당 하나의 지시문 만 사용할 수 있습니다"라고 명시되어 있습니다.
theblang

9
@mattblang, 모듈은 실제로 HTML 문서가 아닌 Angular 응용 프로그램과 관련됩니다. 일반적으로 페이지 / 문서 당 하나의 앱만 필요하지만 동일한 페이지 / 문서에서 여러 Angular 애플리케이션 (각각 하나 이상의 모듈을 사용할 수 있음)을 실행하려면 각 애플리케이션을 수동으로 부트 스트랩해야합니다. -사용하지 마십시오 ng-app(작동하지 않기 때문에). ng-appHTML 문서 당 한 번만 사용할 수 있습니다. 페이지에 앱이 하나만있는 경우 실제로는 바로 가기에 불과합니다. 이는 일반적인 경우입니다.
Mark Rajcok 2013 년

1
이것의 예가 있습니까? 간결한 boostrap api 문서를 보았지만 작동시킬 수 없습니다. 나는 이것을 잠시 동안 봤는데 하나의 작동 예제가없는 것 같습니다. 또한, 이것이 경로와 어떻게 작동할까요? 분명히 충돌 문제가 있습니다.
Robert Christian

또한 ng-app을 사용하여 다른 개발자에게 페이지의 어느 부분이 어떤 모듈에 의해 제어되고 있는지 정확히 보여주는 방식이 정말 마음에 듭니다. 이 작업을 수행하기 위해 페이지에서 마크 업을 사용할 방법이 없습니까? 아니면 적어도 마크 업에 힌트가 있습니까?
chrismarx 2013-08-27

1
- NG-응용 프로그램 지침에 대한 처음 두 단락은 모두를 말한다 docs.angularjs.org/api/ng.directive:ngApp
SIMO

38

ngApp의 제한 이없는 대체 지시문을 만들었습니다 . 라고 ngModule합니다. 다음은 코드를 사용할 때의 모습입니다.

<!DOCTYPE html>
<html>
    <head>
        <script src="angular.js"></script>
        <script src="angular.ng-modules.js"></script>
        <script>
          var moduleA = angular.module("MyModuleA", []);
          moduleA.controller("MyControllerA", function($scope) {
              $scope.name = "Bob A";
          });

          var moduleB = angular.module("MyModuleB", []);
          moduleB.controller("MyControllerB", function($scope) {
              $scope.name = "Steve B";
          });
        </script>
    </head>
    <body>
        <div ng-modules="MyModuleA, MyModuleB">
            <h1>Module A, B</h1>
            <div ng-controller="MyControllerA">
                {{name}}
            </div>
            <div ng-controller="MyControllerB">
                {{name}}
            </div>
        </div>

        <div ng-module="MyModuleB">
            <h1>Just Module B</h1>
            <div ng-controller="MyControllerB">
                {{name}}
            </div>
        </div>
    </body>
</html>

다음에서 소스 코드를 얻을 수 있습니다.

http://www.simplygoodcode.com/2014/04/angularjs-getting-around-ngapp-limitations-with-ngmodule/

본질적으로 제한없이 AngularJS가 내부적으로 사용하는 동일한 코드입니다.


luisperezphd : 블로그 게시물을 읽었습니다. 앱을 중첩하거나 (예 : AJAX가로드 된 위젯이있는 위젯 빌더) 페이지에 이미 앱이 있는지 감지하고 다른 앱을 첫 번째 종속성으로 삽입하는 방법이 있습니까? 나는 내가 성취하려는 것에 대한 자세한 내용과 함께 여기 에 내 질문을 게시했습니다 . 감사!
Daniel Bonnell

@ACIDSTEALTH AngularJS가 요소가 이미 부트 스트랩되었다고보고한다는 사실은 코드가 AngularJS 내부에있을 수 있지만 알 수있는 방법이 있음을 의미합니다. 알아 내기 위해 AngularJS의 축소되지 않은 버전과 해당 오류에 대한 중단 점을 참조하여 if 조건을 확인할 수 있습니다. StackOverflow 질문 링크에서 확인할 수있는 내용을 보면 런타임에 모듈을 동적으로 "주입"하려는 것처럼 들립니다. 그렇다면이 기사를 살펴보실 수 있습니다 : weblogs.asp.net/dwahlin/…
Luis Perez

안녕하세요 @LuisPerez, 웹 사이트를 확인했습니다. 나는 내 컴퓨터에서 그것을 지쳤다. angularJS가 "ng-modules"/ "ng-module"을 감지하지 못합니다. 내 파일에 포함 된 참조가 필요합니까?
sujay kodamala

예 @sujaykodamala, ngModule은 AngularJS에 내장되어 있지 않으며 내가 만든 지시문입니다. GitHub에서 다운로드 할 수 있습니다. 여기에서 찾을 수 있습니다 : github.com/luisperezphd/ngModule
Luis Perez

안녕하세요 @Luis Perez! 나는 당신의 블로그 게시물을 확인하고 있었고 그들은 정말 굉장합니다. 시간이 있으시다면 여기에서 문제를 해결하기 위해 내 게시물을 확인하십시오 -stackoverflow.com/questions/46952478/… . 감사.
user8512043

19

여러 개의 [ng-app]을 사용하는 이유는 무엇입니까? Angular는 모듈을 사용하여 재개되므로 여러 종속성을 사용하는 앱을 사용할 수 있습니다.

자바 스크립트 :

// setter syntax -> initializing other module for demonstration
angular.module('otherModule', []);

angular.module('app', ['otherModule'])
.controller('AppController', function () {
    // ...do something
});

// getter syntax
angular.module('otherModule')
.controller('OtherController', function () {
    // ...do something
});

HTML :

<div ng-app="app">
    <div ng-controller="AppController">...</div>
    <div ng-controller="OtherController">...</div>
</div>

편집하다

컨트롤러 내부에서 컨트롤러를 사용하려면 다음과 같이 controllerAs 구문을 사용해야합니다.

<div ng-app="app">
    <div ng-controller="AppController as app">
        <div ng-controller="OtherController as other">...</div>
    </div>
</div>

잡히지 않은 오류 : [$ injector : modulerr] errors.angularjs.org/1.3.14/$injector/…… criptMinification % 2Fbower_components % 2Fangular % 2Fangular.min.js % 3A17 % 3A381)
Anandaraja_Srinivasan

2 개 모듈의 순서를 뒤집어 보셨나요? ( 'app'보다 먼저 'otherModule')이 솔루션을 많이 사용하고 완벽하게 작동하기 때문에 ...
Monkey Monk

1
확인 ! 내가 제공하는 Javascript 예제에서 오류를 보았습니다. 이제 고쳐진 것 같아요! 기록을 위해 동일한 모듈에 대해 2 곳에서 setter 구문을 사용하겠습니다. 이는 분명히 허용되지 않습니다! :-)
Monkey Monk

우리가 그것을 할 포즈 '길
해리 보쉬

9

여러 각도 응용 프로그램을 부트 스트랩 할 수 있지만 다음과 같습니다.

1) 수동으로 부트 스트랩해야합니다.

2) "문서"를 루트로 사용해서는 안되지만 각도 인터페이스가 포함 된 노드는 다음과 같습니다.

var todoRootNode = jQuery('[ng-controller=TodoController]');
angular.bootstrap(todoRootNode, ['TodoApp']);

이것은 안전 할 것입니다.


3

두 모듈 모두 수동 부트 스트랩이 작동합니다. 이거 봐요

  <!-- IN HTML -->
  <div id="dvFirst">
    <div ng-controller="FirstController">
      <p>1: {{ desc }}</p>
    </div>
  </div>

  <div id="dvSecond">
    <div ng-controller="SecondController ">
      <p>2: {{ desc }}</p>
    </div>
  </div>



// IN SCRIPT       
var dvFirst = document.getElementById('dvFirst');
var dvSecond = document.getElementById('dvSecond');

angular.element(document).ready(function() {
   angular.bootstrap(dvFirst, ['firstApp']);
   angular.bootstrap(dvSecond, ['secondApp']);
});

다음은 Plunker http://plnkr.co/edit/1SdZ4QpPfuHtdBjTKJIu?p=preview에 대한 링크입니다 .

참고 : html에는 ng-app. id대신 사용되었습니다.


0

단일 페이지 앱에 하위 앱을 중첩하기 위해 여러 모듈과 라우터 콘센트를 사용하여 Angular 애플리케이션에 대한 POC를 만들었습니다. 소스 코드는 https://github.com/AhmedBahet/ng-sub-apps 에서 얻을 수 있습니다.

이것이 도움이되기를 바랍니다.

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