25

何がベストプラクティスで、何を使用すべきかわかりません。

以下の2つの方法の違いは何ですか?

module.service(..);

module.factory(..);
4

2 に答える 2

47

これについては、Pawel Kozlowski による素晴らしい Google グループの投稿があります。

https://groups.google.com/forum/#!msg/angular/hVrkvaHGOfc/idEaEctreMYJ

パウエルから引用:

実際、$provide.provider、$provide.factory、および $provide.service は、それらすべてがオブジェクト インスタンスを作成するための青写真/指示であるという意味で、多かれ少なかれ同じものです (これらのインスタンスは、コラボレーターに注入する準備ができています)。 .

$provide.provider は、ブループリントを登録する最も洗練された方法であり、複雑な作成機能と構成オプションを持つことができます。

$provide.factory は、構成オプションをサポートする必要はないが、より洗練された作成ロジックが必要な場合の $provide.provider の簡易バージョンです。

$provide.service は、作成ロジック全体がコンストラクター関数の呼び出しに要約される場合に使用します。

したがって、構築ロジックの複雑さに応じて、$provide.provider、$provide.factory、および $provide.service のいずれかを選択しますが、最終的に得られるのは新しいインスタンスです。

これは、(スレッドからの)実証する付属のフィドルです: http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/

そしてコード:

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

//service style, probably the simplest one
myApp.service('helloWorldFromService', function() {
    this.sayHello = function() {
        return "Hello, World!"
    };
});

//factory style, more involved but more sophisticated
myApp.factory('helloWorldFromFactory', function() {
    return {
        sayHello: function() {
            return "Hello, World!"
        }
    };
});

//provider style, full blown, configurable version     
myApp.provider('helloWorld', function() {

    this.name = 'Default';

    this.$get = function() {
        var name = this.name;
        return {
            sayHello: function() {
                return "Hello, " + name + "!"
            }
        }
    };

    this.setName = function(name) {
        this.name = name;
    };
});

//hey, we can configure a provider!            
myApp.config(function(helloWorldProvider){
    helloWorldProvider.setName('World');
});


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {

    $scope.hellos = [
        helloWorld.sayHello(),
        helloWorldFromFactory.sayHello(),
        helloWorldFromService.sayHello()];
}
于 2013-05-15T13:19:47.830 に答える