【发布时间】:2024-04-20 10:00:01
【问题描述】:
我有一个非常简单的 AngularJS SPA,使用 UI Router 在两个视图之间切换。单击主页链接后,用户将看到一行文本。 About 链接应该做同样的事情,但它的路由被配置为使用 templateUrl 而不是模板字符串:
$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!";
}]);
注意帮助我诊断问题的两个控制台语句。
问题:当控制器脚本文件执行时,控制器本身从未被调用。因此,用户不会看到文本,而是看到:
{{消息}}
这似乎与我在模板文件(about.html)中包含脚本文件有关。如果我将脚本标签移动到 index.html,问题就会消失,一切都按预期工作。
Here's a plunker that shows my problem and workaround.
真正的问题: 在这个非常简单和人为的示例中,将所有控制器脚本包含在 SPA 的主页中是合理的。但即使是一个非常简单的 Web 应用程序,也可能有几十个页面和几十个控制器。将所有控制器添加到主页不会很好地扩展性能,也不会很好地扩展以进行维护。
那么设置它的适当方法是什么?应该如何/在哪里包含控制器脚本?
编辑:我忘了提及我收到的错误(是的,我知道)。使用 about.html 中的脚本标签,我收到一条消息,说
参数 'aboutController' 不是函数,未定义
这直接发生在控制台消息“Registered aboutController”之后。如果我移动脚本标记以将控制器包含在 index.html 中,则不会显示错误。同样,对我来说,这表明控制器根本无法及时调用。移到 index.html,在需要的时候已经完全注册了。
【问题讨论】:
-
如果您在页面上看到字面意义上的
{{message}},这意味着该模板根本没有被处理。如果 Angular 确实处理了模板,那么如果没有填充message,您将什么也看不到。这表明某些东西会产生致命错误。你检查过你的 Javascript 控制台是否有错误? -
为什么你的 about 模板包含一个完整的 HTML 文件?它应该只包含与特定视图相关的 sn-p。您也不能在文件中使用
ng-controller,因为您已经在路由器中使用controller: ...。您必须将带有控制器的文件包含到您的主文件中,作为您的主module的依赖项,否则路由器在尝试加载您的路由时找不到控制器。 -
@deceze 我花了一些时间在 plunker 的 readme.md 文档中制作了一个更完整的描述,但不知何故忘记在这里提及错误。是的,有一个错误说 aboutController 不是一个函数。这直接显示在我的控制台消息“Registered aboutController.”之后。如果我将脚本标签移动到 index.html,消息就会消失。因此,即使注册控制器的脚本及时执行,也无法创建实际的控制器。我会把这个添加到问题中。感谢您指出。
-
@deceze 我在模板中有一个完整的 HTML 文件,主要是因为那是我完成所有修改的地方。原版只有script和h3标签,但对结果没有影响。
-
@deceze 关于使用 ng-controller:同样,这是修补的结果,对结果没有影响(经过测试)。您所说的这一部分:“您必须将带有控制器的文件包含到主文件中,作为主模块的依赖项,否则路由器在尝试加载路由时找不到控制器”是完美的我发现了什么的描述。不过,我认为这是一种解决方法,因为(正如我在帖子末尾提到的)该策略根本无法很好地扩展。
标签: javascript angularjs controller angular-ui-router