我有一个非常简单的AngularJS SPA,使用UI路由器在两个视图之间切换。点击主页链接后,用户将看到一行文字。关于链接也应该这样做,但它的路由配置为使用templateUrl而不是一个模板字符串:AngularJS UI路由器:何处包含控制器脚本
$stateProvider
.state("home", {
url: "/home",
template: "<h3>This is the Home content</h3>"
})
.state("about", {
url: "/about",
templateUrl: "about.html",
controller: "aboutController"
});
about.html是因为它可以是一样简单:
<!DOCTYPE HTML>
<html ng-app="simpleApp">
<head>
<title>About</title>
<script src="aboutcontroller.js"></script>
</head>
<body ng-controller="aboutController">
<h3>{{message}}</h3>
</body>
</html>
。 ..和它的控制器也是纯做作的样板:
console.log("Registered aboutController"); ///////////
angular.module("simpleApp")
.controller("aboutController", ["$scope", function ($scope) {
console.log("Created aboutController"); ///////////
$scope.message = "This is the About content!";
}]);
注意两个控制台陈述,帮我诊断问题。
问题:当控制器脚本文件执行时,控制器本身永远不会被调用。所以也看不到文本,用户只要看到:
{{消息}}
这似乎是我包括在模板文件(有关该脚本文件中涉及到的事实。 HTML)。如果我将脚本标记移到index.html,问题就会消失,一切都按预期工作。
Here's a plunker that shows my problem and workaround.
真正的问题: 在这个非常简单的和人为的例子,它是合理的,包括在SPA的主要页面的所有控制器的脚本。但即使是一个非常简单的Web应用程序,也可能有几十个页面和数十个控制器。将所有控制器添加到主页面并不能很好地提升性能,并且不能很好地进行维护。
那么设置它的适当方法是什么?控制器脚本应该如何/包括在哪里?
编辑:我忘了提及我收到的错误(是的,我知道)。随着about.html script标签,我收到一条消息说
参数“aboutController”不是一个函数,得到了不确定
这直接发生在控制台消息“注册aboutController”之后。如果我将脚本标记移动到index.html中以包含控制器,则不显示任何错误。同样,对我来说,这表示控制器根本无法及时拨打电话。移动到index.html,它在需要时被完全注册。
如果您在页面上看到字面意思是“{{message}}”,那意味着该模板根本没有被处理。如果Angular没有处理模板,如果没有填充“消息”,则只会看到任何内容。这指出产生致命错误的事物。你有没有检查你的Javascript控制台的错误? – deceze
为什么你的模板包含整个HTML文件?它应该只包含与特定视图相关的片段。你也不能在文件中使用'ng-controller',因为你已经在路由器中使用'controller:...'了。您必须将带有控制器的文件包含在您的主文件中,作为您的主模块的依赖项,否则路由器在尝试加载您的路由时找不到控制器。 – deceze
@deceze我花了一些时间在plunker的readme.md文档中制作了一个更完整的描述,并且忘记了在这里提到错误。是的,有一个关于控制器不是一个函数的错误。这会在我的控制台消息“Registered aboutController。”后直接显示。如果我将脚本标记移至index.html,则消息将消失。所以即使注册控制器的脚本及时执行,实际的控制器也不能被创建。我会把这个添加到问题中。感谢您指出。 –