7

私はまだAngularJSを学んでおり、依存性注入のフレーバーについて質問があります. 例として、パラメーターを受け取るメソッドDataProcessorを持つサービスがあり、そのデータ (xml、json など) を読み取り、それに対していくつかのアクションを実行する必要があるとします。コンストラクターは、特定のファイルの種類を読み取る方法を認識しているインターフェイスの実装を受け取ります。以下は、私が話しているサービスの例です。processDatauriDataProcessorDataReader

// 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

3 に答える 3

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() はサービスを取得します

于 2014-08-19T12:11:47.647 に答える
0

DI の仕組みのため、実際にはサービスのインスタンスを作成する必要はありません。あなたがすることは、必要なサービスをコントローラーに注入することであり、それはうまくいくはずです。上記の場合、コントローラーは次のように定義される可能性があります。

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

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

ここで行う必要がある他の唯一のことは、Angular アプリ モジュールを含める前に、「App」が「ng-app」ディレクティブで指定した名前であることを確認し、ページに「DataProcessor」を含む JS ファイルが含まれていることを確認することです。 (技術的には、これらを同じファイルで定義することもできます)。お役に立てれば!

編集

ちなみに、縮小する必要がある場合は、次のようにコントローラーを定義します。

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 をパラメータとしてサービス ルーチンに渡すことができます。私はあなたのユースケースについてあまり知らないので、これらの提案を一粒の塩で受け取ってください. 幸運を!

于 2013-12-19T14:39:21.170 に答える