它真的需要SampleCtrl。$ inject = ['$ scope','$ http'];

时间:2014-02-25 06:58:52

标签: javascript angularjs

我是Angularjs的新手,几天前刚刚开始,

我有一个使用$ http的代码,工作正常。

var sampleApp = angular.module('sampleApp', []); // Define new module for our application

      // Create new controller, that accepts two services $scope and $http
      function SampleCtrl($scope, $http) {
    $scope.date = "sample date"; // Bind data to $scope

    // Define new function in scope
    $scope.fetch = function() {
      // Use $http service to fetch data from the PHP web service
      $http.get('api.php').success(function(data) {
        $scope.date = data.date; // Bind the data returned from web service to $scope
      });
    }

  };

  SampleCtrl.$inject = ['$scope', '$http']; // Ask Angular.js to inject the requested services,      
  sampleApp.controller('SampleCtrl', SampleCtrl); // Initialize controller in pre-defined module

========================
 我尝试了两件事

1。当我从上面的代码中注释 SampleCtrl.$inject = ['$scope', '$http']; 行时,代码仍然有用,我需要知道,为什么我们需要这个或什么时候我们需要这个。

2。将抓取功能分开,如

function fetchData() {
          // Use $http service to fetch data from the PHP web service
          $http.get('api.php').success(function(data) {

             $scope.date = data.date; // Bind the data returned from web service to $scope
          });
          return $scope;
        }
      // Create new controller, that accepts two services $scope and $http
      function SampleCtrl($scope, $http) {
        // Define new function in scope
        $scope.fetch = fetchData($scope, $http);

      };

抱歉无法生成jsfiddle,但这是我试用的代码

https://www.openshift.com/blogs/how-to-use-angularjs-with-php-hosting-on-openshift

在“etting Started with Angular.js部分。

1 个答案:

答案 0 :(得分:1)

这是因为代码缩小。当您使用minifier运行代码时,它会将SampleCtrl中的参数名称替换为function SampleCtrl(a,b),您需要避免这种情况,因为依赖注入器不知道要注入哪些服务。

一种解决方案是像你一样使用$inject。这将确保DI将注入正确的服务。

另一种解决方案是以这种风格编写控制器

angular.module('myApp').controller('myCtrl', ['$scope', '$http', function($scope, $http) {
    // logic
}]);

这两种方式可以互换