Angular.bootstrap error: Ошибка: [ng: btstrpd] Приложение уже загружено с помощью этого элемента

Я создаю виджет, который зависит от Angular вместе с инструментом построения виджета. Строитель использовал Angular с ngApp, прикрепленным к тегу html документа.

Когда я загружаю виджет внутри построителя виджета, я получаю следующую ошибку:

Error: [ng:btstrpd] App Already Bootstrapped with this Element '<div class="company-widget" id="widget-app" data-company="demoCorp">'

Вот функция начальной загрузки:

angular.bootstrap('#widget-app', ["myWidget"]);

Для всех целей и задач остальная часть приложения myWidget представляет собой довольно стандартное сочетание контроллеров и служб.

Я следил за этим сообщением в блоге о том, как разрешить несколько директив ngApp на одной странице, однако я не понял до тех пор, пока я не установил это, что в конце сообщения в блоге говорится, что вы не можете встраивать приложения, что происходит здесь, и что может произойти на небольшом количестве сайтов, использующих этот виджет.

Я не могу перепроектировать виджет-построитель, и я могу разумно предположить, что для любых сайтов Angular, где виджет встроен, сайт узла будет прикреплять ngApp к тегу html.

Мой вопрос в том, есть ли способ обойти это ограничение, даже если это хакерское решение? Можно ли проверить, есть ли на странице уже приложение и ввести приложение myWidget в хост-приложение в качестве зависимости?

Ответ 1

Вы можете попробовать что-то вроде этого:

https://jsfiddle.net/pavy/vnnuxgwo/

// Parent/host application
var myApp = angular.module('myApp', []);

myApp.controller('AppCtrl',
    function($scope) {
        $scope.name = 'YourName';
    }
);

// Third party module
// This needs to happen after myApp is defined
var myWidget = angular.module('myApp');
myWidget.controller('MyWidgetCtrl',
    function($scope) {
        $scope.widgetName = 'This is my widget.';
    }
);

Код стороннего модуля (ваш виджет) должен появиться после приложения-хоста (в вашем случае это будет код Builder).

Вы также зависите от имени модуля хост-приложения, поэтому, если он изменится, ваш код сломается. Есть вероятные способы программно получить загруженное имя приложения Angular, которое поможет в этом отношении.