私の理解では、ファクトリ内では、コントローラに注入されるオブジェクトを返します。サービス内では、オブジェクトを使用して処理し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.first
を変更すると、 も変更されるACtrl
ことがわかります。たとえば、user.first
はシングルトンですか?BCtrl
User
私の想定では、新しいインスタンスがファクトリを使用してコントローラーに注入されたのでしょうか?
ベストアンサー1
すべての Angular サービスはシングルトンです。
ドキュメント (シングルトンとしてのサービスを参照):https://docs.angularjs.org/guide/services
最後に、すべての Angular サービスはアプリケーション シングルトンであることを認識することが重要です。つまり、インジェクターごとに特定のサービスのインスタンスが 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 ミートアップの 1 つで使用されました。http://blog.angularjs.org/2012/11/more-angularjs-meetup-videos.html