1. ホーム
  2. angularjs

[解決済み] ServiceとFactoryで迷う

2022-03-16 07:18:37

質問

私が理解しているように、ファクトリー内では、コントローラに注入されるオブジェクトを返します。サービス内部では、私は this であり、何も返しません。

私は、あるサービスが 常にシングルトン であること、そして 新しいファクトリーオブジェクト はすべてのコントローラでインジェクトされます。しかし、結局のところ、ファクトリーオブジェクトもシングルトンなのでしょうか?

デモのためのコード例です。

var factories = angular.module('app.factories', []);
var app = angular.module('app',  ['ngResource', 'app.factories']);

factories.factory('User', function () {
  return {
    first: 'John',
    last: 'Doe'
  };
});

app.controller('ACtrl', function($scope, User) {
  $scope.user = User;
});

app.controller('BCtrl', function($scope, User) {
  $scope.user = User;
});

を変更する場合 user.firstACtrl ということになります。 user.firstBCtrl も変更されます。 User はシングルトンですか?

私の推測では、新しいインスタンスはファクトリーでコントローラに注入されるのでは?

解決方法は?

angularのサービスはすべてシングルトンです。 :

Docs(参照 シングルトンとしてのサービス ): https://docs.angularjs.org/guide/services

最後に、Angularのサービスはすべてアプリケーションシングルタンであることを認識することが重要です。つまり、1つのインジェクタにつき、1つのサービスのインスタンスしか存在しないのです。

基本的にサービスとファクトリーの違いは、以下の通りです。

app.service('myService', function() {

  // service is just a constructor function
  // that will be called with 'new'

  this.sayHello = function(name) {
     return "Hi " + name + "!";
  };
});

app.factory('myFactory', function() {

  // factory returns an object
  // you can run some code before

  return {
    sayHello : function(name) {
      return "Hi " + name + "!";
    }
  }
});

provideについて、こちらのプレゼンテーションをご覧ください。 http://slides.wesalvaro.com/20121113/#/

このスライドは、あるAngularJsのミートアップで使用されたものです。 http://blog.angularjs.org/2012/11/more-angularjs-meetup-videos.html