将环境详细信息注入AngularJS控制器

Ram*_*esh 3 javascript angularjs

让我们从AngularJS教程中获取示例

function PhoneListCtrl($scope, $http) {
   $http.get('phones/phones.json').success(function(data) {
      $scope.phones = data;
   });

   $scope.orderProp = 'age';
}

//PhoneListCtrl.$inject = ['$scope', '$http'];
Run Code Online (Sandbox Code Playgroud)

现在,假设我不想硬编码网址'phones/phones.json',并且更喜欢托管此控制器的页面注入它,在Angular JS中做同样的方法应该是什么?

Ben*_*esh 6

有很多方法可以做到这一点......最简单的方法就是使用$window,所以你要注入$ window服务,这基本上就是注入的全局$窗口.然后你可以注册这些路径window.path = 'whatever.json';,你会没事的:

window.path = 'some/path.json';

function PhoneListCtrl($scope, $http, $window) {
   $http.get($window.path).success(function(data) {
      $scope.phones = data;
   });

   $scope.orderProp = 'age';
}
Run Code Online (Sandbox Code Playgroud)

更高级的方法是创建一个模块,其中包含您注入应用程序的服务,在这种情况下,每个页面都有自己的模块:

 //create your module.
 angular.module('configData', [])
   .factory('pathService', function () {
        return {
           path: 'some/path.json'
        };
   });

//then inject it into your app
var app = angular.module('myApp', ['configData']);

app.controller('PhoneListCtrl', function($scope, $http, pathService) {
   $http.get(pathService.path).success(function(data) {
       $scope.phones = data;
   });

   $scope.orderProp = 'age';
});
Run Code Online (Sandbox Code Playgroud)

当然,你可以在两者之间做任何事情.我建议采用最易维护的路径,同时仍然易于测试.