Angularjs服务单身人士吗?
在参考书中我读到:
最后,认识到所有的Angular服务都是应用单例是很重要的。 这意味着每个喷油器只有一个给定服务的实例。
但是这个简单的代码似乎不是一个单身人士
'use strict'; angular.module('animal', []) .factory('Animal',function(){ return function(vocalization){ return { vocalization:vocalization, vocalize : function () { console.log('vocalize: ' + this.vocalization); } } } }); angular.module('app', ['animal']) .factory('Dog', function (Animal) { return Animal('bark bark!'); }) .factory('Cat', function (Animal) { return Animal('meeeooooow'); }) .controller('MainCtrl',function($scope,Cat,Dog){ $scope.cat = Cat; $scope.dog = Dog; console.log($scope.cat); console.log($scope.dog); //$scope.cat = Cat; });
我有点困惑,你能解释我有什么事吗?
更新1可能是我不是在棚子最尖锐的工具,但后者@Khanh回复将是一个更好的解释在参考它不是很清楚。
更新2
'use strict'; angular.module('animal', []) .factory('Animal',function(){ return { vocalization:'', vocalize : function () { console.log('vocalize: ' + this.vocalization); } } }); angular.module('dog', ['animal']) .factory('Dog', function (Animal) { Animal.vocalization = 'bark bark!'; Animal.color = 'red'; return Animal; }); angular.module('cat', ['animal']) .factory('Cat', function (Animal) { Animal.vocalization = 'meowwww'; Animal.color = 'white'; return Animal; }); angular.module('app', ['dog','cat']) .controller('MainCtrl',function($scope,Cat,Dog){ $scope.cat = Cat; $scope.dog = Dog; console.log($scope.cat); console.log($scope.dog); //$scope.cat = Cat; });
BOOM这是一个单身人士!
更新3
但是,如果你喜欢
'use strict'; angular.module('animal', []) .factory('Animal',function(){ return function(vocalization){ return { vocalization:vocalization, vocalize : function () { console.log('vocalize: ' + this.vocalization); } } } }); angular.module('app', ['animal']) .factory('Dog', function (Animal) { function ngDog(){ this.prop = 'my prop 1'; this.myMethod = function(){ console.log('test 1'); } } return angular.extend(Animal('bark bark!'), new ngDog()); }) .factory('Cat', function (Animal) { function ngCat(){ this.prop = 'my prop 2'; this.myMethod = function(){ console.log('test 2'); } } return angular.extend(Animal('meooow'), new ngCat()); }) .controller('MainCtrl',function($scope,Cat,Dog){ $scope.cat = Cat; $scope.dog = Dog; console.log($scope.cat); console.log($scope.dog); //$scope.cat = Cat; });
有用
它是单身人士,只有一个对象,但被注入许多地方。 (对象通过引用传递给方法)
你所有的Animal
都是对象指针,指向你的情况下的一个函数 。 你的Dog
是由这个函数构造的对象。
是的,服务是单身。 以下代码只logging一个“M”到控制台:
function M() { console.log('M'); } function M1(m) { console.log(1); } function M2(m) { console.log(2); } angular.module('app', []) .service('M', M) .service('M1', ['M', M1]) .service('M2', ['M', M2]) .controller('MainCtrl',function(M1, M2){});
在jsbin中运行它
让我举一个关于AngularJS中单例的例子。 假设我们在单页面应用程序的不同部分使用了2个控制器:
myApp.controller('mainController', ['$scope', '$log', function($scope, $log) { $log.main = 'First Var'; $log.log($log); }]);
所以现在如果我们去了通过mainController
控制器控制的页面,我们会在日志中看到这个:
如你所见,日志对象现在包含我的第一个variables。
现在,这是我的第二个控制器:
myApp.controller('secondController', ['$scope', '$log', '$routeParams', function($scope, $log, $routeParams) { $log.secondVar = 'Second Var'; $log.log($log); }]);
所以如果你点击被控制的第二页,你会看到:
现在回到第一页:
你对这3个步骤有什么结论?
他们是一个注入到应用程序的$log
对象。 正如Tony Alicea所说:这是一个很大的记忆保存。
所以这个服务被称为一次,每次我们将新的variables和参数添加到同一个对象,而不是为不同的参数添加不同的对象。
你的例子使用factory
,而不是service
。 请注意, provider
也是游戏的一部分。
迄今为止最好的学习资源:
AngularJS:服务vs提供者vs工厂
MiškoHevery有一个启发性的解释和factory
, service
和provider
的实际例子。 强烈推荐 。