gpt4 book ai didi

javascript - RequireJS 正在加载 Angular 应用程序,但不会创建 app.controller

转载 作者:行者123 更新时间:2023-11-30 00:31:40 25 4
gpt4 key购买 nike

我已经设置了一个非常基本的环境,用于使用 RequireJS 加载 AngularJS 组件(由 Bower 管理)。我的index.html非常基础:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Angular Resource Test</title>
</head>
<body>

<div ng-controller="MyCtrl">
<ul>
<!-- this template is not populated -->
<li ng-repeat="item in items">{{item}}</li>
</ul>
</div>

<script type="text/javascript" src="bower_components/requirejs/require.js" data-main="scripts/main"></script>
</body>
</html>

我的 RequireJS 都在 main.js 中,看起来像这样:

requirejs.config({
baseUrl: 'bower_components',
paths: {
'angular': '../bower_components/angular/angular',
'angular-resource': '../bower_components/angular-resource/angular-resource'
},
shim: {
'angular': {
exports: 'angular'
},
'angular-resource': {
deps: ['angular'],
}
},
});

define("app", ["angular", "angular-resource"], function(angular) {
var app = angular.module('MyApp', ['ngResource']);
return app;
});

require(["app"], function(app) {
console.log(app); // this works
app.controller("MyCtrl", ['$scope', '$resource',
function($scope, $resource) {
console.log("hello"); // this doesn't work
$scope.items = [1, 3, 4, 5];
}
]);
});

似乎所有依赖项都已解析并加载,并且正在实例化 Angular 应用程序。但是,我无法注册 Angular Controller 。console.log()回调函数中的语句没有执行,所以看起来 Controller 创建完全失败了?

/编辑:

添加 ng-app指令<body>产生此错误:

Uncaught Error: [$injector:modulerr] Failed to instantiate module MyApp due to: Error: [$injector:nomod] Module 'MyApp' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.

You can find the complete project on GitHub ,如果这样更清楚的话。

最佳答案

您的代码中有几处应该/可能会更正。

  • 缺少 angular.bootstrap(document, ['MyApp']);。因为当你使用 requireJS 时,angular.bootstrap() 是一个需要。在脚本加载时不是 angular got init right,而是 require got init first。这会导致您的应用程序崩溃。为了使其正常工作,您需要等待 require init => 然后它将加载 angular up 和 init angular => 在完成所有操作后,引导您的应用程序。
  • define() 应该包装模块/文件的所有代码
  • require() 用于调用模块/文件。
  • RequireJS 用于将模块分离到文件中。因此,如果您配置得当,它将更易于管理,并可能缩短应用程序的加载时间。通过将许多模块放入文件中。你刚刚破坏了 requireJS 的使用目的。 (例如,我构建了一个应用程序,该应用程序的代码、插件和 html 总量约为 3MB。但在第一页加载时,它只有 400kb,很酷吗?)

您可以尝试以下操作:

requirejs.config({
baseUrl: 'bower_components',
paths: {
'angular': '../bower_components/angular/angular',
'angular-resource': '../bower_components/angular-resource/angular-resource',
'app' : '../scripts/app' // 'app' is the module name. It got defined by define() block, and can be loaded by either require() or define() block
},
shim: {
'angular': {
exports: 'angular'
},
'angular-resource': {
deps: ['angular'],
}
},
});



require(["app"], function(app) {
console.log(app);
app.controller("MyCtrl", ['$scope', '$resource',
function($scope, $resource) {
console.log("hello"); // this doesn't work
$scope.items = [1, 3, 4, 5];
}
]);

angular.bootstrap(document, ['MyApp']);
});

在你的 app.js 中

define(["angular", "angular-resource"], function(angular) {
var app = angular.module('MyApp', ['ngResource']);
return app;
});

关于javascript - RequireJS 正在加载 Angular 应用程序,但不会创建 app.controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29207740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com