在ng-map中显示标记失败,报错[ng:areq] 'myCtrl'不是函数
解决ng-maps中"myCtrl is not a function, got undefined"错误
这个错误本质是Angular找不到你定义的myCtrl控制器,咱们一步步来排查和解决:
常见原因及修复方案
1. 控制器未正确注册到Angular模块
Angular 1.3+之后默认不推荐全局控制器,一定要把控制器注册到对应的模块里,还要确保依赖ngMap模块(因为你用的是ng-maps组件)。
正确的控制器注册方式:
angular.module('myApp', ['ngMap']) .controller('myCtrl', function($scope) { // 这里写你的控制器逻辑,比如设置标记位置 $scope.markerPos = [40.7128, -74.0060]; // 示例:纽约坐标 });
2. HTML中模块和控制器引用错误
要确保你的HTML页面正确指定了ng-app(对应模块名)和ng-controller(对应控制器名),而且拼写要完全一致(大小写敏感!)。
示例HTML结构:
<html ng-app="myApp"> <body ng-controller="myCtrl"> <!-- ng-maps组件 --> <ng-map center="{{markerPos}}"> <marker position="{{markerPos}}" title="My Marker"></marker> </ng-map> </body> </html>
3. 脚本加载顺序不对
脚本加载顺序直接影响Angular能否识别控制器,正确的顺序应该是:
- 先加载AngularJS核心库
- 再加载ng-maps的脚本
- 最后加载你自己的控制器代码(或者内嵌的控制器脚本)
示例加载顺序:
<script src="https://code.angularjs.org/1.3.15/angular.js"></script> <script src="https://rawgit.com/allenhwkim/angularjs-google-maps/master/build/scripts/ng-map.min.js"></script> <script src="https://maps.google.com/maps/api/js?libraries=places&key=AIzaSyDQ2TPHVI30yFa6-yVLf8ffNRTlwWvAmf8"></script> <!-- 你的控制器脚本放在最后 --> <script> // 这里写控制器代码 </script>
4. 避免全局控制器的坑
如果你之前用了全局控制器(比如直接写function myCtrl($scope) {}),Angular 1.3+默认禁用了这种方式,所以一定要改用模块注册的方式,否则Angular会找不到这个控制器。
完整可运行示例
给你一个完整的代码示例,你可以直接参考:
<!DOCTYPE html> <html ng-app="myApp"> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <script src="https://code.angularjs.org/1.3.15/angular.js"></script> <script src="https://rawgit.com/allenhwkim/angularjs-google-maps/master/build/scripts/ng-map.min.js"></script> <script src="https://maps.google.com/maps/api/js?libraries=places&key=AIzaSyDQ2TPHVI30yFa6-yVLf8ffNRTlwWvAmf8"></script> </head> <body ng-controller="myCtrl"> <ng-map center="[40.7128, -74.0060]" zoom="12"> <marker position="[40.7128, -74.0060]" title="New York City"></marker> </ng-map> <script> angular.module('myApp', ['ngMap']) .controller('myCtrl', function($scope) { // 这里可以添加动态修改标记的逻辑,比如点击按钮改变位置 }); </script> </body> </html>
最后再检查一遍:控制器名称拼写是否和HTML里的一致,模块是否正确依赖了ngMap,脚本加载顺序有没有问题,应该就能解决这个错误了。
内容的提问来源于stack exchange,提问作者krishna mohan
相关产品推荐
相关产品推荐

