工厂,服务和提供商之间有什么区别?

时间:2014-06-21 13:52:27

标签: javascript angularjs

首先,我想澄清一下,我是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/

为什么对于所有最相同的东西,有三种不同的术语?如果有任何重大差异那么那是什么?

1 个答案:

答案 0 :(得分:1)

小提琴演示了预期的行为。我不明白是什么让你困惑。

关于你的问题:“为什么三个几乎相同的东西有不同的术语?”

如果我们对3个几乎完全相同的东西使用完全相同的名称,那么我们如何区分它们呢?对不同的事物使用不同的名称是合理的(即使它们非常相似)。


我认为真正的问题不是“为什么不同的术语”,而是“为什么有3个不同的功能(factoryserviceprovider)用于同一目的(声明一个Angular Service)“。

您可能会感到失望,因为没有3种方法可以声明Angular服务:constantvalue是2个缺失的函数。

实际上只有一个概念,一个Angular服务,以及一个声明一个的方法:provider

其他4个函数(constantfactoryservicevalue)所取得的任何成就也可以通过provider实现,但代码更多。
provider是最灵活的(允许最大的可配置性),但也是最冗长的 因此,其他4个函数是常用Angular Services类型的快捷方式。


顺便说一句,在 the docs

中已经清楚地解释了这一点

<强>工厂
[...]这是注册服务的简称,其服务提供者只包含$ get属性,这是给定的服务工厂函数。

<强>服务
[...]这是注册服务的简称,其服务提供者的$ get属性是将用于实例化服务实例的服务构造函数。

相关问题