Як визначити два кутових програми / модулі на одній сторінці?


118

Я намагаюся додати два кутових програми / модулі на одну сторінку. У наведених нижче скрипках ви бачите, що завжди тільки перший модуль, на який посилається в html-коді, буде працювати правильно, тоді як другий не розпізнається по кутовим.

У цій скрипці ми можемо виконати лише doSearch2метод, тоді як у цій скрипці лише doSearchметод працює правильно.

Я шукаю спосіб, як правильно розмістити два кутових модуля на одній сторінці.

Відповіді:


123

Лише одна програма AngularJS може бути автоматично завантажена на один документ HTML. Перший ngApp, знайдений у документі, буде використаний для визначення кореневого елемента для автоматичного завантаження як програми. Для запуску декількох додатків у документі HTML потрібно завантажувати їх вручну, використовуючи натомість angular.bootstrap. Програми AngularJS не можна вкладати одна в одну. - http://docs.angularjs.org/api/ng.directive:ngApp

Дивитися також


@MarkRajcok Отож, чи добре використовувати лише один модуль на HTML-документ? Приклад " ng-app="project"Підключення резервного копію" на головних наборах сторінок AngularJS і говорить, що "це дозволяє мати модулі, які працюють у різних частинах сторінки", але документ ngApp говорить, що "для одного документа HTML можна використовувати лише одну директиву".
theblang

9
@mattblang, модулі пов'язані з кутовими програмами, а не дуже HTML-документами. Зазвичай вам потрібен лише один додаток на сторінку / документ, але якщо ви хочете запустити кілька кутових додатків (кожен з яких може використовувати один або кілька модулів) на одній сторінці / документі, вам потрібно буде вручну завантажувати кожен з них - - не використовуйте ng-app(бо це не буде працювати). ng-appможе використовуватися лише один раз для кожного документа HTML. Це дійсно просто ярлик, якщо у вас є лише один додаток на сторінці, що є нормальним випадком.
Марк Райкок

1
Чи є приклад цього? Я бачу документальну документацію boostrap api, але я не в змозі змусити її працювати. Я деякий час переглядав це, і, здається, немає жодного робочого прикладу. Крім того, як у світі це би працювало з маршрутами? Очевидно, є питання зіткнення.
Роберт Крістіан

Також мені дуже подобається, як за допомогою ng-програми інший розробник показує, яку саме частину сторінки контролює модуль. Чи немає способу використовувати розмітку на сторінці для цього? Або принаймні, якийсь натяк на розмітку?
chrismarx

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) або виявити, чи на сторінці вже є додаток, і ввести інший додаток як залежність першого? Я щойно опублікував тут своє запитання з більш детальною інформацією про те, що я намагаюся досягти. Дякую!
Даніель Боннелл

@ACIDSTEALTH Той факт, що AngularJS повідомляє, що елемент вже завантажений, означає, що повинен бути якийсь спосіб сказати - хоча цей код може бути внутрішнім для AngularJS. Щоб дізнатись, ви можете посилатися на незмінену версію AngularJS та на цю помилку, щоб побачити умову if. З того, що я можу зробити з вашого посилання на питання StackOverflow, це здається, що ви хочете динамічно "вводити" модуль під час виконання. Якщо це так, ви можете поглянути на цю статтю: weblogs.asp.net/dwahlin/…
Луїс Перес

Привіт @LuisPerez, я перевірив твій веб-сайт. Я набридла на своїй машині. angularJS не виявляє "ng-модулів" / "ng-модулів". Чи потрібні мені якісь посилання, що містяться у моєму файлі?
sujay kodamala

Так @sujaykodamala, ngModule не вбудований у AngularJS - це створена нами директива. Ви можете завантажити його з GitHub. Ви можете знайти його тут: github.com/luisperezphd/ngModule
Луїс Перес

Привіт @Luis Perez! Я перевіряв вашу публікацію в блозі, і вони справді приголомшливі. Якщо у вас є час, НЕ могли б ви перевірити мій пост тут , щоб вирішити проблему - stackoverflow.com/questions/46952478 / ... . Дякую.
користувач8512043

19

Чому ви хочете використовувати декілька [ng-app]? Оскільки Angular поновлюється за допомогою модулів, ви можете використовувати додаток, який використовує кілька залежностей.

Javascript:

// 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>

EDIT

Майте на увазі, що якщо ви хочете використовувати контролер всередині контролера, ви повинні використовувати синтаксис 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-х модулів? ('OtherModule' перед 'app') Тому, що я багато використовую це рішення, і воно прекрасно працює ...
Monkey Monk

1
Гаразд ! Я бачив помилку в прикладі Javascript, який я надаю. Я думаю, це зараз виправлено! Для запису я використовував синтаксис сеттера у двох місцях для одного модуля ... що, очевидно, заборонено! :-)
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']);
});

Ось посилання на http://plnkr.co/edit/1SdZ4QpPfuHtdBjTKJIu Plunker http://plnkr.co/edit/1pd

ПРИМІТКА: У html немає ng-app. idбуло використано замість цього.


0

Я створив POC для програми Angular, використовуючи кілька модулів та маршрутизаторів, щоб гніздовати додаткові додатки в одному додатку сторінки. Ви можете отримати вихідний код за адресою: https://github.com/AhmedBahet/ng-sub-apps

Сподіваюсь, це допоможе

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.