首先,我想澄清一下,我是AngularJS的新手。您可能会发现我的问题与AngularJS: Service vs provider vs factory重复,但我正在尝试理解这件事让我感到困惑。因为我在一个控制器中改变值也会在其他控制器中受到影响。
根据该问题的答案,服务是由自己创建的对象,但它仍然在所有控制器之间共享。
Angular JS
var myApp = angular.module('demo', []);
// Factory Implementation
myApp.factory('myFactory', function () {
var service = {};
service.TestData = 'This is default data from factory';
return service;
});
// Service Implementation
myApp.service('myService', function () {
this.TestData = 'This is service';
});
// First Controller
myApp.controller('myFirstController', function ($scope, myFactory, myService,myProvider) {
$scope.ProviderData = myProvider;
$scope.MyData = myFactory;
$scope.ServiceData = myService;
$scope.testFun = function () {
$scope.MyData.TestData = 'This is new data from factory';
$scope.ServiceData.TestData = 'New Service data';
$scope.ProviderData.thingOnConfig = 'New thing from first controller';
}
});
// Second Controller
myApp.controller('mySecondController', function ($scope, myFactory, myService,myProvider) {
$scope.ProviderData = myProvider;
$scope.MyData = myFactory;
$scope.ServiceData = myService;
});
myApp.provider('myProvider', function () {
this.TestData = 'This is from provider';
this.$get = function () {
var that = this;
return {
thingOnConfig: that.TestData
}
}
});
myApp.config(function (myProviderProvider) {
myProviderProvider.TestData = 'This is new from config of provider';
});
HTML
<div class="row" ng-app="demo" ng-cloak>
<div class="row" ng-controller="myFirstController">
<div class="row">
{{MyData.TestData}}
<br />
{{ServiceData.TestData}}
<br />
{{ProviderData.thingOnConfig}}
</div>
<div class="row">
<input type="button" value='click here for update' ng-click="testFun()" />
</div>
</div>
<div class="row" ng-controller="mySecondController">
<div class="row">
{{MyData.TestData}}
<br />
{{ServiceData.TestData}}
<br />
{{ProviderData.thingOnConfig}}
</div>
</div>
</div>
小提琴链接:http://jsfiddle.net/8Cg2s/
为什么对于所有最相同的东西,有三种不同的术语?如果有任何重大差异那么那是什么?
答案 0 :(得分:1)
小提琴演示了预期的行为。我不明白是什么让你困惑。
关于你的问题:“为什么三个几乎相同的东西有不同的术语?”
如果我们对3个几乎完全相同的东西使用完全相同的名称,那么我们如何区分它们呢?对不同的事物使用不同的名称是合理的(即使它们非常相似)。
我认为真正的问题不是“为什么不同的术语”,而是“为什么有3个不同的功能(factory
,service
,provider
)用于同一目的(声明一个Angular Service
)“。
您可能会感到失望,因为没有3种方法可以声明Angular服务:constant
和value
是2个缺失的函数。
实际上只有一个概念,一个Angular服务,以及一个声明一个的方法:provider
。
其他4个函数(constant
,factory
,service
,value
)所取得的任何成就也可以通过provider
实现,但代码更多。
provider
是最灵活的(允许最大的可配置性),但也是最冗长的
因此,其他4个函数是常用Angular Services类型的快捷方式。
<强>工厂强>
[...]这是注册服务的简称,其服务提供者只包含$ get属性,这是给定的服务工厂函数。
<强>服务强>
[...]这是注册服务的简称,其服务提供者的$ get属性是将用于实例化服务实例的服务构造函数。
等