12

ng-app通常,我会执行以下操作,并且我的 HTML 中会有一个:

var myApp = angular.module("myApp", []);

myApp.controller("AttributeCtrl", function ($scope) {
    $scope.master = {
        name: "some name"
    };
});

但是,我需要手动引导 angular,因为我只在通过 jQuery 加载的应用程序的一部分中使用它$.load()。如果我执行以下操作:

main.js - 这是我要使用 angular 的页面被拉入的地方

$("#form").load(contextPath + url, params, function() {
    angular.bootstrap($("#angularApp"));
});

然后被拉入的页面有它自己的javascript:

function AttributeCtrl($scope) {
  $scope.master = { name: "some name"};
}

这可行,但是,理想情况下,我希望我的控制器在模块级别的范围内。所以我像这样修改了上面的代码

main.js

$("#form").load(contextPath + url, params, function() {
    angular.bootstrap($("#angularApp", ["myApp"]));
});

接着...

var app = angular.module("myApp"); // retrieve a module

app.controller("AttributeCtrl", function($scope) {
  $scope.master = { name: "some name"};
});

但是,以这种方式检索模块似乎不起作用。难道我做错了什么?

4

4 回答 4

3

启动应用程序后,您无法创建控制器。请参阅angular.bootstrap.

加载或定义模块后,您应该调用 angular.bootstrap()。您不能在应用程序引导后添加控制器、服务、指令等。

于 2015-07-14T00:04:03.767 回答
1

我不知道这是否只是您在此处的示例代码,但是:

angular.bootstrap($("#angularApp", ["myApp"]));

应该

angular.bootstrap($("#angularApp"), ["myApp"]);

您检索模块的代码应该可以工作。

于 2013-08-21T18:17:19.163 回答
0

不确定这是否算作错误或实施决定(尽管看起来很糟糕)。添加一个空数组可以解决require您遇到的未定义问题,并且应该可以整体解决您的问题。

var app = angular.module("myApp", []); // create a module

app.controller("AttributeCtrl", function($scope) {
   $scope.master = { name: "some name"};
});`

此外,在您的小提琴中,您调用{{name}}的不会渲染。你应该打电话{{master.name}}


编辑

谢谢大家的反对。这是一个有效的例子。祝你好运!

http://plnkr.co/edit/UowJpWYc1UDryLLlC3Be?p=preview

于 2013-08-22T01:27:17.970 回答
0

更新

他们更新了文档,现在看起来像这样

数组中的每个项目都应该是一个预定义模块的名称或一个(DI 注释的)函数,注入器将作为运行块调用它们。请参阅:{@link angular.module 模块}


这似乎是一个错误。

您实现检索模块的方式是正确的。只需从文档中引用它以使其清楚,因为它可能并不为人所知。

当传递两个或更多参数时,会创建一个新模块。如果仅传递一个参数,则检索现有模块(作为第一个参数传递给模块的名称)。

对于你提到的问题,长话短说......

bootstrap函数调用createInjector与模块列表['ng', ['ngLocale', function(){...}] , 'myApp'](最后一个是你传入的模块)

function bootstrap(element, modules) {
    ...
    var injector = createInjector(modules);

在内部createInjector(),它调用loadModules传入的每个模块

function createInjector(modulesToLoad) {
    forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });

loadModules调用angularModule,它被初始化为angularModule = setupModuleLoader(window);,它创建了对象window.angular.module

function loadModules(modulesToLoad){
    ....
    var moduleFn = angularModule(module); // triggers the error

发生错误,因为angularModule将第二个参数作为requires. 没有它,它将在这一行(第 1148 行)抛出异常throw Error('No module: ' + name);

报道:https ://github.com/angular/angular.js/issues/3692

于 2013-08-21T21:21:54.293 回答