6

我现在正在学习如何使用 AngularJS。我在很大程度上掌握了 Angular 处理依赖注入的方式,但是我找不到答案。

假设我有一项基于用户查询从网络检索数据的服务;它可能看起来像这样:

var webBasedServiceModule = angular.module('WebBasedService', []);

webBasedServiceModule
    .factory('webBasedService', function ($http) {
        var rootUrl = "http://example.com/myApi?query=";
        return {
            getData: function(query) {
                return $http.get(rootUrl + query)
                    .then(function(httpCallbackArg) {
                        return doSomething(httpCallbackArg);
                    });
            }
        }
    });

我正在注入 $http 服务,所以我可以模拟它进行测试。但是,我在课堂上硬编码了我的 Web 服务的根 URL。理想情况下,我想将此 URL 与服务类分离,并将其作为依赖项注入。但是,我看不到将字符串或其他原语注入角度工厂函数的方法。理想情况下,我希望代码如下所示:

var webBasedServiceModule = angular.module('WebBasedService', []);

webBasedServiceModule
    .factory('webBasedService', function ($http, rootUrl) {
        return {
            getData: function(query) {
                return $http.get(rootUrl + query)
                    .then(function(httpCallbackArg) {
                        return doSomething(httpCallbackArg);
                    });
            }
        }
    });

我可以看到的一种解决方案是创建一个UrlProviderService并将该服务注入到WebBasedService模块中,然后调用urlProvider.Url或类似的方法。这似乎有点臭:只为一个配置数据创建一个全新的服务似乎有点矫枉过正。我什至可以想象我可以创建一个字符串形式的服务,如下所示

var urlServiceModule = angular.module('UrlService', []);

urlServiceModule
    .factory('rootUrl', function () {
        return "http://example.com/myApi?query=";
    });

不过,这似乎是对服务概念的滥用。

AngularJS 是否为将原语作为配置数据注入的问题提供了“标准”解决方案?还是我只使用上述解决方案之一?

4

2 回答 2

9

您可以使用.constant()注入您的配置。

var app = angular.module("app", []);

app.constant("rootUrl", "http://www.example.com");

app.factory('webBasedService', function ($http, rootUrl) {
    return {
        rootUrl: rootUrl
    }
});

app.controller("MyCtrl", ["$scope", "webBasedService", function ($scope, webBasedService) {
    $scope.rootUrl = webBasedService.rootUrl;
}]);

jsfiddle 上的示例

于 2013-07-29T23:34:34.327 回答
0

扩展上面的(很棒的)答案——这正是我需要的线索——对于我们这些喜欢命名函数的人来说,这里的风格略有不同。我一直在想如何为 AGES 做到这一点,所以干杯马克!

 angular.module('myModule', [])
   .constant('rootUrl','http://localhost:3001')
   .factory('dataService', ['$http', 'rootUrl', dataServiceImplementation])
   .controller('MainController', ['$scope', 'dataService', mainController])
于 2016-07-29T09:26:46.880 回答