注入应用程序的角度控制器未定义

Angular controller injected into app is undefined

本文关键字:控制器 未定义 应用程序 注入      更新时间:2023-09-26

我正在努力使我制作的这个简单的Angular应用程序更加模块化。我把控制器分解成它自己的文件,在它自己的目录中。我正在使用依赖项注入使控制器在应用程序模块中可用。我正在通过串联/缩小链接html中的两个文件。我已经正确设置了控制器的依赖项,并且据我所知,该部分工作正常。

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Hello Tester Application</title>
    <link rel="stylesheet" href="css/lib/bootstrap.min.css">
    <link rel="stylesheet" href="css/main.min.css">
</head>
<body ng-app="helloTesterApp">
    <header>
        <h1>Hello Tester App</h1>
    </header>
    <p class="description">This application calls the DropWizard example project to say hello to the user using that API.</p>
    <main ng-controller="HelloController">
        <div class="content-container">
            <input class="input-sm" type="text" name="name" placeholder="Enter your name here" ng-model="user.name">
            <button class="btn" type="button" ng-click="sayHello()">Get Greeting</button>
            <p class="response">Response Message: {{response.message}}</p>
        </div>
        <div>
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit sapiente facilis ea harum, nostrum doloribus pariatur totam beatae vero nemo. Assumenda ad qui a rerum reiciendis cumque optio commodi facere.</p>
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
        </div>
        <div>
            <p>Current request Port: {{config.port}}</p>
            <p>If you would like to send the request to a different port, enter it here: <input class="input-sm" type="text" name="port" placeholder="alternative port" ng-model="config.altPort"></p>
        </div>
    </main>
    <footer>
      <script src="js/vendor/angular.min.js"></script>
      <script src="js/vendor/angular-route.min.js" charset="utf-8"></script>
      <script src="js/vendor/jquery-2.2.3.min.js" charset="utf-8"></script>
      <script src="js/app.min.js"></script>
    </footer>
</body>
</html>

helloController.js

angular.module('helloController', ['helloService'])
    .controller("HelloController", ['HelloService', '$scope', function($scope, HelloService) {
    $scope.user = {
        name: ""
    };
    $scope.response = {
      message: ""
    };
    $scope.config = {
      port: 9000,
      altPort: 0
    };
    $scope.sayHello = function() {
        $scope.response.message = HelloService.sayHello($scope.user.name, $scope.config.port);
    };
}]);

app.js(v.1)

angular.module('helloTesterApp', ['helloController']);

app.js(v.2)

angular.module('helloTesterApp', ['helloController'])
    .controller('HelloController', HelloController);

我尝试了版本2,因为我认为问题可能是我没有在应用程序上明确设置控制器,但这只会产生错误:"未捕获类型错误:HelloController未定义。"

有人能解释一下我做错了什么吗?感谢

声明并作为参数的依赖项的顺序必须匹配:

尝试更改:

['HelloService', '$scope', function($scope, HelloService)

['HelloService', '$scope', function(HelloService, $scope)

首先,控制器注入顺序很重要。也许这个片段可以解决你的问题。

/**
 * QUICKFIX
 */
angular
  .module('helloTesterApp', ['helloService']) 
  .controller('HelloController', HelloController);
HelloController.$inject = ['HelloService', '$scope'];
function HelloController(HelloService, $scope) {
  ... // insert controller's code here
} 

但你可以做得更好。。。

(function() {
  'use strict';
  /**
   * hello.module.js
   */
  angular
    .module('helloTesterApp', [
      /* Shared modules */
      'app.mySharedModule',
      /* Feature areas*/
      'helloService'
    ]);
})();

(function() {
  'use strict';
  /**
   * hello.controller.js
   */
  angular
    .module('helloTesterApp') // <-- DIFF HERE
    .controller('HelloController', HelloController);
  HelloController.$inject = ['HelloService', '$scope'];
  function HelloController(HelloService, $scope) {
    ... // insert controller's code here
  } 
})();

也许这能帮到你https://github.com/johnpapa/angular-styleguide/tree/master/a1希望它能解决你的问题。

更新忘了提一下,你不应该依赖控制器,你应该依赖另一个模块。为什么你的模块定义是错误的。

angular.module('helloTesterApp', ['helloController'] /* <- This isn't a module */);

你能做些什么来将HelloController与app.js分离?你可以做这个

(function() {
  'use strict';
  angular
    .module('app', [
      'app.hello'
    ]);
})();

并定义一个新模块,比如hello.module.js文件上的app.hello

(function() {
  'use strict'
  angular
    .module('app.hello', []);
})();

最后,在hello.controller.js 上创建控制器

(function() {
  'use strict';
  angular
    .module('app.hello')
    .controller('HelloController', HelloController);
  HelloController.$inject = ['HelloService', '$scope'];
  function HelloController(HelloService, $scope) {
    // your code
  }
})();