AngularJS依赖注入交换实现

时间:2013-12-19 14:34:38

标签: angularjs angularjs-injector

我还在学习AngularJS,并对他们的依赖注入风格有疑问。例如,假设我有DataProcessor服务,其processData方法接受uri参数,并且需要读取该数据(可能是xml,json等)。 )然后对它执行一些操作。 DataProcessor构造函数接受了DataReader接口的实现,该接口知道如何读取某种文件类型。以下是我所谈论的一些示例服务:

// implementations of the DataReader interface
myApp.service('XmlDataReader', function() {
    this.readData = function(uri) {
        // read xml data from uri
    }
}]);

myApp.service('JsonDataReader', function() {
    this.readData = function(uri) {
        // read json data from uri
    }
}]);

// data processing service that takes in an implementation of a DataReader
myApp.service('DataProcessor', ['DataReader', function(DataReader) {

    this.processData = function(uri) {
        var readData = DataReader.readData(uri);

        // process data and return it
    }
}]);

从典型的依赖注入角度来看,特定类型的DataReader可以传递到DataProcessor并像这样使用:

var dataProcessor = new DataProcessor(new JsonDataReader());
var processedData = dataProcessor.processData('dataz.json');

AngularJS的做法是什么?

4 个答案:

答案 0 :(得分:7)

答案 1 :(得分:2)

做这样的事情:

myApp.service('DataProcessor', ['$injector', 'valueRecipeOfTheServicename', function($injector, valueRecipeOfTheServicename) {

    this.processData = function(uri) {
        var service = $injector.get(valueRecipeOfTheServicename);

        // process data and return it
    }
}]);

$ injetcor.get()检索服务

答案 2 :(得分:1)

基于Noypi Gilas answer,我使用服务名称启动控制器并通过$ injetcor.get()检索它:

len(n) in reader

答案 3 :(得分:0)

由于DI的工作方式 - 您不必真正创建服务实例。你所做的就是将所需的服务注入控制器,它应该可以正常工作。在上面的例子中,您的控制器可能被定义为:

var app = angular.module('App', ['DataProcessor']);

function MyController($scope, DataProcessor) {
    var uri = '';
    DataProcessor.processData(uri);
}

这里唯一需要做的就是确保“App”是您在“ng-app”指令中指定的名称,并确保您的页面包含带有“DataProcessor”的JS文件你包括角度app模块(从技术上讲,这些甚至可以在同一个文件中定义)。希望这有帮助!

修改

顺便说一句,如果你需要缩小 - 以下是你如何定义控制器:

var app = angular.module('App', ['DataProcessor']);

// if you need to minify:
var MyController = ['$scope', 'DataProcessor',
    function($scope, DataProcessor) {
        var uri = '';
        DataProcessor.processData(uri);
    }
];

其他建议

我目前对服务的理解是用于在控制器之间共享数据或代码。如果此数据处理特定于该控制器,您可能会考虑将“ProcessData”实现直接移动到控制器中。有时这样的更改比处理服务中的数据更简单。如果您确实处理了服务中的数据,您可能仍希望将该数据写回范围。在这种情况下,您可以将$ scope作为参数传递到服务例程中。由于我对您的用例不太了解,所以只需要考虑这些建议。祝你好运!