服务和工厂可以互换使用吗?

时间:2015-11-25 00:12:35

标签: angularjs service factory

Angular JS概念概述。独立于视图的业务逻辑:服务(标题)。 描述说 - 将独立于视图的逻辑从控制器移动到服务中,但代码表示工厂。我在这里缺少什么?

angular.module('finance2', [])
.factory('currencyConverter', function() {
  var currencies = ['USD', 'EUR', 'CNY'];

链接到resource

2 个答案:

答案 0 :(得分:1)

工厂方法('recipe')是一种创建'服务'的方法。

您还可以使用服务,常量,值和提供商配方('方法')创建'服务'。

无论如何,你最终会实例化一个概念上属于“服务”的对象。

人们普遍承认,这是Angular令人困惑的一个方面。请参阅this classic Stackoverlow question

开发者指南也很好地澄清了这些概念:

  

您构建的每个Web应用程序都由协作完成任务的对象组成。这些对象需要实例化并连接在一起才能使应用程序正常工作。在Angular应用程序中,大多数这些对象都是实例化的,并由注入服务自动连接在一起。

     

注入器创建两种类型的对象,服务和专用对象。

     

服务是API由开发人员编写服务定义的对象。

     

专用对象符合特定的Angular框架API。这些对象是控制器,指令,过滤器或动画之一。

     

注射器需要知道如何创建这些对象。您可以通过注册“配方”来使用注射器创建对象来告诉它。有五种食谱类型。

     

最详细,但也是最全面的是提供者食谱。其余四种食谱类型 - 价值,工厂,服务和常数 - 只是提供者食谱之上的语法糖。

答案 1 :(得分:1)

来自Java背景,我非常喜欢角形工厂的概念;我们在某种程度上模仿了POJO。我可以附加有意义的方法并执行模型中自包含的逻辑。对于服务,我倾向于将这些视为我在服务器端处理服务,而仅仅是为了获取数据。

例如,如果我们正在构建某种类型的Twitter克隆,对于推文流,我有TweetSteamFactory内部使用TweetService获取数据以获取最新推文。也许我的工厂有一个getNextPage()方法,它绑定到ngClick某处 - 当被解雇时,它当然会使用TweetService进行调用。

无论如何,我确实看到了服务和工厂之间的明显区别,尽管我的理解可能是错误的。

http://plnkr.co/edit/SqPf212nE5GrSPcZdo5K

<强>控制器

app.controller('MyController', function(FoobarFactory) {
   FoobarFactory()
      done(function(factory) {
         var factory = factory;
         $scope.data = factory.getData();
         $scope.baz = factory.getBaz();
      })
});

<强>工厂

app.factory('FoobarFactory', ['MyService', function(MyService) {

    function Foobar() {};                     // Empty constructor

    angular.extend(Foobar.prototype, {
        _init: function() {
            var deferred = $.Deferred();            

            var foobar = this;

            this.baz = true;
            this.data = undefined;

            MyService.getData()
                .done(function(data) {
                    foobar.data = data;
                    deferred.resolve(foobar);
                 })

            deferred.resolve();

            return deferred.promise();
        },
        getBaz: function() {
            return this.baz;
        },
        getData: function() {
            return this.data;
        }

    });

    return function () {
        var deferred = $.Deferred();
        var foobar = new Foobar();

        foobar._init()
            .done(function() {
                deferred.resolve(foobar);
            })
            .fail(function(error) {
                deferred.reject(error);
            });

        return deferred.promise();
    };

}]);