【问题标题】:Argument '<controller>' is not a function in Angular routing参数 '<controller>' 不是 Angular 路由中的函数
【发布时间】:2014-12-01 13:33:18
【问题描述】:

我收到了这个错误,我找不到问题,以下是我的错误

Error: [ng:areq] Argument 'homeCtrl' is not a function, got undefined http://errors.angularjs.org/1.2.25/ng/areq?p0=homeCtrl&p1=not%20aNaNunction%2C%20got%20undefined at VALIDITY_STATE_PROPERTY (http://localhost:8100/lib/ionic/js/ionic.bundle.js:7703:12) at assertArg (http://localhost:8100/lib/ionic/js/ionic.bundle.js:9134:11) at assertArgFn (http://localhost:8100/lib/ionic/js/ionic.bundle.js:9144:3) at $get (http://localhost:8100/lib/ionic/js/ionic.bundle.js:14903:9) at updateView (http://localhost:8100/lib/ionic/js/ionic.bundle.js:42986:30) at IonicModule.directive.directive.compile (http://localhost:8100/lib/ionic/js/ionic.bundle.js:42942:9) at nodeLinkFn (http://localhost:8100/lib/ionic/js/ionic.bundle.js:14336:13) at compositeLinkFn (http://localhost:8100/lib/ionic/js/ionic.bundle.js:13730:13) at nodeLinkFn (http://localhost:8100/lib/ionic/js/ionic.bundle.js:14330:24) at compositeLinkFn (http://localhost:8100/lib/ionic/js/ionic.bundle.js:13730:13)

以下是我的 Angular 和 Ionic 项目:

#app.js
angular.module('ft', ['ionic', 'ft.controllers'])
.run(function($ionicPlatform) {
  // run method
})
.config(function($stateProvider, $urlRouterProvider){
  $stateProvider
  .state('app', {
    url: '/app',
    abstract: true,
    templateUrl: 'templates/sideMenu.html',
    controller: 'menuCtrl'
  })
  .state('app.home', {
    url: '/home',
    views: {
      'menuContent': {
        templateUrl: 'templates/home.html',
        controller: 'homeCtrl'
      }
    }
  });
  $urlRouterProvider.otherwise('/app/home');
});

#www/js/controllers/home_ctrl.js
angular.module('ft.controllers', [])
  .controller('homeCtrl', function($scope, $ionicModal, $timeout){

  });

#index.html file
<script src="js/app.js"></script>
<script src="js/controllers/home_ctrl.js"></script>

但是如果我从路由中删除homeCtrl,它就可以正常工作。我现在花了相当多的时间,对我来说似乎没问题。

【问题讨论】:

  • 您能否毫无疑问地验证浏览器是否能够下载home_ctrl.js 文件?
  • 我在 plnkr 中运行它,没有错误:plnkr.co/edit/7eSdX3nE0CKHqomgMEoh?p=preview
  • OP,我认为您的 home_ctrl.js 位置错误
  • @MichaelPerrenoud,感谢您的回答。 home_ctrl.js 可从浏览器访问,问题在于模块加载重复。我发布了一个详细的答案
  • @NoIdeaForName,感谢您的回答,home_ctrl.js 可以从浏览器访问,问题在于模块加载重复。我发布了一个详细的答案

标签: javascript angularjs ionic-framework ngroute


【解决方案1】:

你好像在用bundling &amp; minification,试试:

var app = angular.module('ft.controllers', []);
app.controller('homeCtrl', ['$scope', '$ionicModal', '$timeout', function ($scope, $ionicModal, $timeout) {
});

JS 代码的缩小替换变量名称。 AngularJS 是否基于此名称注入模块。

【讨论】:

  • 不,这是有效的初始化。
  • 不幸的是,这仍然不是问题。 Angular 无法找到控制器,因为它没有被加载。
  • 当您使用缩小时,这怎么可能不是问题?如果缩小过程更改了控制器的签名,如何找到控制器?
  • 缩小不会更改控制器本身的名称,只会更改注入的参数名称,即使如此,它们也会在所有引用的位置发生更改。缩小不是问题。
  • 这不是真的。 Angular 通过参数名称注入。
【解决方案2】:

最后我能够解决这个问题,问题是ft.controllers 在两个控制器中使用。

angular.module('ft.controllers', [])
  .controller('homeCtrl', function($scope, $ionicModal, $timeout){
  });

angular.module('ft.controllers', [])
.controller('menuCtrl', function($scope, $ionicModal, $timeout){
]});

当我将名称更改为 ft.controllers.homeft.controllers.menu 并将它们添加到 app.js 时,它开始工作

我怎么认为它会起作用,因为我相信 ionic sideMenu 启动应用程序中使用的相同

#controllers.js from ionic started sideMenu app
angular.module('starter.controllers', [])

.controller('AppCtrl', function($scope, $ionicModal, $timeout) {
})

.controller('PlaylistsCtrl', function($scope) {
})

controllers.js file

app.js file

project

【讨论】:

  • 请记住,您实际上可以像 angular.module('ft.controllers', []) 这样在 app.js 文件中定义模块,然后像 angular.module('ft.controllers').controller(...) 这样在任何地方添加控制器。请注意,第二次调用不会发送一个数组——它变成了一个 get 而不是 define
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多