You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS 1.8.3出现[$controller:ctrlreg]报错如何解决

必须修改的报错点

两个核心问题导致运行失败,修正后即可正常运行:

  • HTML结构嵌套错误:现有代码将<body>标签写在了<head>内部,不符合HTML规范,浏览器解析时会打乱脚本执行顺序。需要将<body>移动到</head>闭合标签之后,保证<head>、<body>为<html>下的同级节点。
  • 控制器注册方式不符合AngularJS 1.8.x规范:你参考的书籍是基于AngularJS 1.2及更早版本编写的,这类旧版本支持直接将全局函数作为控制器使用,但1.3及以上版本默认禁用了该特性,直接使用全局函数会触发[$controller:ctrlreg](控制器未注册)错误。需要先创建Angular模块,将控制器注册到模块上,同时给ng-app指令绑定对应模块名称。

修正后的可直接运行代码如下:

<html>
<head>
    <title>page 29</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta charset="utf-8">
    <script 
            type="text/javascript" 
            src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.3/angular.min.js">
    </script>
    <script> 
        // 定义Angular模块
        var myApp = angular.module('myApp', []);
        // 注册控制器到模块,采用数组形式做显式依赖注入,避免代码压缩后注入失效
        myApp.controller('Ctrl', ['$scope', function ($scope) {
            // 初始化name默认值,避免输入为空时展示undefined
            $scope.name = '';
            $scope.getName = function() {
                return $scope.name;
            }
        }]);
    </script>
</head>
<body ng-app="myApp">
    <div ng-controller="Ctrl">
        Напиши свои мысли о ангуляре
        <input type="text" ng-model="name">
        <h1> angularjs - {{getName()}} </h1> 
        <p></p>
    </div>
</body>
</html>
可补充完善的内容
  • 精简冗余逻辑:当前示例中getName()函数仅返回name变量值,和直接在模板中写{{name}}效果完全一致,可删除该函数减少不必要的脏检查开销。
  • 补充交互提示:空的<p>标签可以增加输入提示、字数统计、非法输入拦截等功能,比如输入为空时提示“请输入内容”。
  • 增加基础样式:调整输入框、标题的间距、字体大小,提升页面可读性。
  • 增加异常处理:比如监听输入内容长度,超出限制时给出提示。
  • 模块化拆分:如果后续功能扩展,可将控制器、服务、指令拆分到单独的JS文件中,避免所有逻辑堆在一个script标签里难以维护。

内容的提问来源于stack exchange,提问作者Roma N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:39:39