2

まず、これは率直な質問です。そして、なぜ私がこれをすべきでないのかについて、正直で正当な答えを探しています...

angular
    .module('X', ['Y'])
    .config(function (myFactoryProvider, myServiceProvider) {
        myFactoryProvider.$get().myFn();
        myServiceProvider.$get().myFn();
    });

angular
    .module('Y', [])
    .factory('myFactory', ['$location', function ($location) {
        return {
            myFn: function () {
                console.log('factory');
                console.log($location.absUrl());
            }
        }
    }])
    .service('myService', ['$location', function ($location) {
        this.myFn = function () {
            console.log('service');
            console.log($location.absUrl());
        }
    }]);

ここに JSFiddle があります: http://jsfiddle.net/1vetnu6o/

これは上記のように機能しており、いくつかの問題を解決します。しかし、私はおそらくこれを行うべきではなく、その理由を理解したい. これをしない正当な理由が本当に必要です。私が本当にしたいという事実にもかかわらず。

tl;dr;

これが問題のコンテキストです...

基本的に関連するヘルパー メソッドのグループを含むこの 1 つのサービス (たまたまファクトリ) がある複数の製品で使用されるこの内部フレームワークがあります。この場合、デバイス関連のisMobileDevice, isAndroid, getDeviceType(戻り値mobile,tabletまたはdesktop)、およびその他のいくつか...

config()このサービスは、関数へのアクセスが必要なため、フレームワークを使用してアプリケーションのフェーズに挿入する必要がありますgetDeviceTypedeviceType問題は、 で適切なテンプレートをロードするために を取得する必要があるということです$routeProviderconfig()すべてのルートに使用される正しいテンプレート パスを構築している段階です。に依存するものもあれdeviceTypeば、デバイスに依存しない汎用テンプレートを持つものもあります。

これはサービスであるため、フェーズに直接注入することはできませんがconfig()、この記事で前述した手法を使用してそのメソッドを呼び出すことができます。

現在、これをどのように解決していますか?ヘルパー サービスは実際にはプロバイダーであり、すべてのメソッドはプロバイダー セクションとファクトリ関数の両方で公開されます。理想的ではありませんが、機能します。私はこれを回避策と考えていますが、フレームワークではなくアプリケーションで回避策を講じたいと考えているため、最初に言及した手法です。

考え?

4

2 に答える 2