AngularJS中的嵌套模块

时间:2016-08-19 16:50:24

标签: javascript angularjs nested angularjs-module

我有两个不同的AngularJs模块:widgetContainer和一个小部件。

窗口小部件可以显示为独立的应用程序,也可以包含在widgetContainer中。 widgetContainer包含0-N小部件。

如果我尝试将widget模块提升到widgetContainer中,则会抛出以下错误:

  

错误:[ng:btstrpd]已使用此元素启动的应用程序'< div id =“childApp”>'   http://errors.angularjs.org/1.5.8/ng/btstrpd?p0=%26lt%3Bdiv%20id%3D%22childApp%22%26gt%3B

我已在this plunk

中重现此错误
<div id="parentApp">
<div ng-controller="MainParentCtrl">
  Hello {{name}} !
  <div id="childApp">
    <div ng-controller="MainChildCtrl">
      Hello {{childName}} !
    </div>
  </div>
</div>

编辑:

使用依赖注入可以有效地解决问题。

现在,我需要从指令加载小部件。

parentApp.directive('widget', [function() {
  return {
    restrict: 'E',
    link: function($scope, $element, $attr) {

      var div = document.createElement('div');
      div.setAttribute("ng-controller", "MainChildCtrl");
      div.innerHTML = 'Hello {{childName}} !';
      $element.append(angular.element(div));

    }
  };
}]);

已创建div但未在内部加载childApp模块。 我已更新了plunker

2 个答案:

答案 0 :(得分:4)

不要尝试引导两个模块。而是使用依赖注入。您只在html中声明一个模块,并使用角度代码使该模块依赖于另一个模块。见这里:https://docs.angularjs.org/guide/concepts#module

这是您更新的plunkr:http://plnkr.co/edit/DJvzpCoxLRhyBl77S27k?p=preview

HTML:

<body>
  <div id="childApp">
    <div ng-controller="MainParentCtrl">
      Hello {{name}} !
      <div>
        <div ng-controller="MainChildCtrl">
          Hello {{childName}} !
        </div>
      </div>
    </div>
  </div>
</body>

AngularJS:

var parentApp = angular.module('parentApp', [])
  .controller('MainParentCtrl', function($scope) {
    $scope.name = 'universe';
  });



var childApp = angular.module('childApp', ['parentApp'])
  .controller('MainChildCtrl', function($scope) {
    $scope.childName = 'world';
  });


angular.element(document).ready(function() {
  angular.bootstrap(document.getElementById('childApp'), ['childApp']);
});

答案 1 :(得分:1)

要达到预期效果,请使用以下

angular.element(document).ready(function() {
  angular.bootstrap(document.getElementById('parentApp'), ['parentApp','childApp']);

});

http://plnkr.co/edit/4oGw5ROo80OCtURYMVa3?p=preview

无论元素上的控制器使用情况如何,手动引导程序的语法如下所示

angular.bootstrap(element, [modules]);