如何在一页中定义两个角度应用程序/module?

IT技术 javascript angularjs
2021-02-03 03:30:30

我正在尝试将两个角度应用程序/module添加到一页。在下面的小提琴中,您可以看到始终只有在 html 代码中引用的第一个module才能正常工作,而 angular 无法识别第二个module。

在这个小提琴中,我们只能执行doSearch2方法,而在这个小提琴中,只有doSearch方法才能正常工作。

我正在寻找如何将两个角度module正确放置在一页中的方法。

6个回答

每个 HTML 文档只能自动引导一个 AngularJS 应用程序。在文档中找到的第一个 ngApp 将用于定义根元素以作为应用程序自动引导。要在 HTML 文档中运行多个应用程序,您必须使用 angular.bootstrap 手动引导它们。AngularJS 应用程序不能相互嵌套。-- http://docs.angularjs.org/api/ng.directive:ngApp

也可以看看

另外,我真的很喜欢使用 ng-app 的方式向另一个开发人员显示页面的哪个部分由哪个module控制。有没有办法在页面上使用标记来实现这一点?或者至少,标记中的一些提示?
2021-03-13 03:30:30
@mattblang,module与 Angular 应用程序相关联,而不是真正的 HTML 文档。通常每个页面/文档只需要一个应用程序,但是如果您想在同一页面/文档上运行多个 Angular 应用程序(每个应用程序可以使用一个或多个module),那么您需要手动引导每个应用程序 - - 不要使用ng-app(因为它不起作用)。 ng-app每个 HTML 文档只能使用一次。如果页面上只有一个应用程序,这实际上只是一条捷径,这是正常情况。
2021-03-17 03:30:30
有这样的例子吗?我看到了简洁的 boostrap api 文档,但我无法让它工作。我已经用谷歌搜索了一段时间,似乎没有一个可行的例子。此外,这在世界上如何与路线一起工作?显然存在碰撞问题。
2021-03-24 03:30:30
ng-app 指令的前两段说明了一切 - docs.angularjs.org/api/ng.directive:ngApp
2021-03-28 03:30:30
@MarkRajcok 那么每个 HTML 文档只有一个module是一种好习惯吗?AngularJS 主页面上的“连接后端”示例设置ng-app="project"并说“这让您可以在页面的不同部分运行module”,但 ngApp 文档指出“每个 HTML 文档只能使用一个指令”。
2021-04-09 03:30:30

我创建了一个没有ngApp's 限制的替代指令它被称为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 内部使用的代码相同,没有限制。

@ACIDSTEALTH AngularJS 报告元素已经引导的事实意味着必须有某种方法可以告诉 - 尽管该代码可能是 AngularJS 的内部代码。要找出答案,您可以参考未缩小版本的 AngularJS 和该错误的断点以查看 if 条件。从我从您的 StackOverflow 问题链接中可以看出,听起来您想在运行时动态“注入”一个module。如果是这样,您可能想看看这篇文章:weblogs.asp.net/dwahlin/...
2021-03-18 03:30:30
luisperezphd:我读了你的博文。有什么方法可以嵌套应用程序(例如带有 AJAX 加载小部件的小部件构建器)或检测页面是否已经有应用程序并注入另一个应用程序作为第一个应用程序的依赖项?我刚刚在这里发布了我的问题并详细说明了我正在尝试完成的工作。谢谢!
2021-03-20 03:30:30
你好@路易斯佩雷斯!我正在查看你的博客文章,它们真的很棒。如果你有时间,你能不能请点击这里查看我的职务,以解决一个问题- stackoverflow.com/questions/46952478/...谢谢。
2021-03-22 03:30:30
嘿@LuisPerez,我查看了你的网站。我在我的机器上累了。angularJS 没有检测到 "ng-modules"/"ng-module" 。我的文件中需要包含任何参考资料吗?
2021-03-23 03:30:30
是的@sujaykodamala,ngModule 没有内置在 AngularJS 中,它是我创建的指令。您可以从 GitHub 下载它。你可以在这里找到它:github.com/luisperezphd/ngModule
2021-04-06 03:30:30

为什么要使用多个 [ng-app] ?由于 Angular 是通过使用module恢复的,因此您可以使用使用多个依赖项的应用程序。

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>

编辑

请记住,如果您想在控制器内部使用控制器,则必须使用 controllerAs 语法,如下所示:

<div ng-app="app">
    <div ng-controller="AppController as app">
        <div ng-controller="OtherController as other">...</div>
    </div>
</div>
我们摆出姿势的方式
2021-03-13 03:30:30
您是否尝试过颠倒 2 个module的顺序?(在 'app' 之前的'otherModule')因为,我经常使用这个解决方案并且它完美地工作......
2021-03-16 03:30:30
行 !我在我提供的 Javascript 示例中看到了一个错误。我想现在已经修复了!作为记录,我将在同一module的 2 个地方使用 setter 语法……这显然是不允许的!:-)
2021-03-23 03:30:30
未捕获的错误:[$注射器:modulerr] errors.angularjs.org/1.3.14/$injector/... ... criptMinification%2Fbower_components%2Fangular%2Fangular.min.js%3A17%3A381)
2021-04-10 03:30:30

您可以引导多个 Angular 应用程序,但是:

1)您需要手动引导它们

2)你不应该使用“document”作为根,而是包含angular接口的节点:

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

这将是安全的。

手动引导这两个module将起作用。看这个

  <!-- 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已被使用。