18

私は AngularJS の初心者で、 と の概念と違いを理解し始めたfactoryところserviceですcontroller。私が理解しているように、 afactoryは、注入できる「値オブジェクト」を返すために使用されます。私が見たほとんどの例は、次のようなことをしています:

angular.module('module.factories', function() {
    factory('FactoryObject', function() {
        return {
            someFunction: function(someParam) {};
            someOtherFunction: function(someOtherParam) {});
        };
    });
});

私のcontrollerでは、このオブジェクトを使用できるようにしたいのですが、コントローラーのイベント/アクションに応じて再初期化できるため、コントローラーで初期化/インスタンス化したいと考えています。したがって、代わりにファクトリーでコンストラクター関数を返すことができるかどうか疑問に思っていましたか?

angular.module('module.factories', function() {
    factory('FactoryObject', function() {

        function FactoryObject(initParam) {
        }

        FactoryObject.prototype.someFunction = function() {};

        return FactoryObject;

    });
});

これは角度のある工場に適したパターンですか? それとも、このようなカスタム オブジェクトにファクトリを使用するのは「やり過ぎ」ですか? それをライブラリjsファイルに含めて、代わりにそこから参照する必要がありますか? ファクトリに配置する利点の 1 つは、使用される場所に注入されるため、テストで簡単にモックできることです。代わりに使用できる Angular の他のメカニズムはありますか?

4

4 に答える 4

3

おっしゃるとおり、これが注入可能な「クラス」(コンストラクター) を作成する方法です。ただし、factoryクラスで使用する他のものを注入する必要がある場合にのみ、使用が必要です。

.factory('Class', ['$q', function ($q) {
    function Class () {}
    Class.prototype = {
        constructor: Class,
        doSomeAsyncAction: function () {
            return $q(function (resolve, reject) {
                // ...
            });
        },
        // ...
    };
    return Class;
})

完全に独立したクラス (たとえば、何らかのデータ構造) を作成している場合は、 を使用するだけconstantで、クラスがサービス プロバイダーでも使用できるようになります。

(function (undefined) {
    function Class () {}
    Class.prototype = { ... };
    angular.module(...)
        .constant('Class', Class);
})();

補足として、使用providerはこれに役立ちません。プロバイダーはまったく異なる目的を果たし、(とりわけ) サービスの単一インスタンスを作成するために最初に要求された注入で_一度_使用されるファクトリ関数を返します。プロバイダーは、アプリケーション構築の _config フェーズ_ でその単一のサービス インスタンスを構成できるようにするために使用されます (ドキュメントを参照してください)。

于 2014-12-18T06:19:39.603 に答える
1

同じ質問がありました。オブジェクト指向の AngularJS サービスのセットアップ方法に関する素晴らしい記事を見つけました。 記事はこちら。サービスではなくファクトリの使用に関する注意事項に注意してください。また、オブジェクトの拡張についても説明します。セットアップが非常に簡単で、Javascript をシンプルかつ簡単に保ちながら、Angular に完全に適合することがわかりました。

シングルトンであり、インスタンス化する必要がない Factory サービスの場合、パフォーマンス上の利点があるオブジェクト リテラル アプローチを使用します。

于 2014-12-18T06:05:54.753 に答える