在我看来,在AngularJS中,服务比工厂更有用;我用对了吗?

在我看来,在AngularJS中,服务比工厂更有用;我用对了吗?,angularjs,Angularjs,我读过很多关于服务和工厂之间的用法和区别的帖子,包括“工厂更复杂”或“你将在80%的时间里使用工厂”或“工厂更有用”,甚至“工厂……使用复杂的创建逻辑”等“服务…使用简单的创建逻辑。我的难题在于,我实际上找到了每种服务的用法 在我看来,服务实际上比工厂能够进行更复杂的操作。下面是一些代码,试图说明我的意思: module.service('Record', function (){ this.retrieve = { all: function(){

我读过很多关于服务和工厂之间的用法和区别的帖子,包括“工厂更复杂”或“你将在80%的时间里使用工厂”或“工厂更有用”,甚至“工厂……使用复杂的创建逻辑”等“服务…使用简单的创建逻辑。我的难题在于,我实际上找到了每种服务的用法

在我看来,服务实际上比工厂能够进行更复杂的操作。下面是一些代码,试图说明我的意思:

module.service('Record', function (){

    this.retrieve = {
            all: function(){
                //retrieve all
            },
            record: function(id){
                //retrieve individual record
            }
        };

    this.save = function(){
        try{
            //save record or throw error                
        }
        catch(e){
            //catch block
        }
        finally{
            //non-conditional action
        }
    };

    this.clear = function(){
        //clear records
    };

    this.test = function() {
        //function used for testing record retrieval and storage
    };
})
注意,为了简单起见,我省略了所有依赖项。我在代码中使用的是一个值服务,它包含应用程序中更新的值,这些值正在本地存储中检索和/或存储

我在想,如果我使用工厂,这个代码的等价物会是什么。我想到了这个:

  module.factory('Record', function (){

return {
    retrieve: retrieve,
    save: save,
    clear: clear,
    test: test
}

    function retrieve(){
            this.all = function(){
                //retrieve all
            }

            this.record = function(id){
                //retrieve individual record
            }
        }

    function save(){
        try{
            //save record or throw error                
        }
        catch(e){
            //catch block
        }
        finally{
            //non-conditional action
        }
    }

    function clear(){
        //clear records
    }

    function test() {
        //function used for testing record retrieval and storage
    }
});
问题在于retrieve()函数。其他一切都正常工作,除了现在,我不能像这样从控制器调用retrieve:

Record.retrieve.all();或Record.retrieve.Record(1)

我看不出使用Factory有什么实际优势,尽管我看过所有的例子,也读过所有的东西。因此,我担心我对它的理解不够充分

对于上面的例子,服务似乎是一个更好的选择。有没有人有过这样一个真实的例子:必须使用工厂才能正常工作,而服务却无法正常工作

重新表述这个问题的更好方法是,我如何正确地将上面的代码实现到工厂中?(不为retrieveAll和retrieveRecord创建单独的函数)


谢谢你阅读我的帖子,也谢谢你的见解

检索
不应是函数,而应是对象:

module.factory('Record', function () {

    return {

        retrieve: {

            all: function() {
                // retrieve all
            },

            record: function(id) {
                // retrieve individual record
            }

        },

        save: function() {
            try {
                // save record or throw error                
            } catch(e) {
                // catch block
            } finally {
                // non-conditional action
            }
        },

        ...

    }

});

检索
不应是函数,而应是对象:

module.factory('Record', function () {

    return {

        retrieve: {

            all: function() {
                // retrieve all
            },

            record: function(id) {
                // retrieve individual record
            }

        },

        save: function() {
            try {
                // save record or throw error                
            } catch(e) {
                // catch block
            } finally {
                // non-conditional action
            }
        },

        ...

    }

});

工厂可用于创建可注入类,而这不能通过服务来实现,因为如果实现返回函数而不是对象文本,则可以使用“
new
”操作符来创建服务的实例(单例)

例如:

module.factory('Monster', function($log){
    return function(name, skills) {
       this.name = name;
       this.skills = skills;
       this.sayName = function() {
           $log.info('Monster's name is:', this.name);
       };
    };
});


myapp.controller('MyController' function($scope, Monster){
   var m1 = new Monster('Godzilla', ['fire']);
   var m2 = new Monster('Gozer');
   // do something with your instances...
});

上面使用服务的示例将返回Monster的实例,而不是构造函数

工厂可用于创建可注入类,而这不能通过服务来完成,因为如果实现返回函数而不是对象文本,则使用“
new
”操作符来创建服务的实例(单例)

例如:

module.factory('Monster', function($log){
    return function(name, skills) {
       this.name = name;
       this.skills = skills;
       this.sayName = function() {
           $log.info('Monster's name is:', this.name);
       };
    };
});


myapp.controller('MyController' function($scope, Monster){
   var m1 = new Monster('Godzilla', ['fire']);
   var m2 = new Monster('Gozer');
   // do something with your instances...
});

上面使用服务的示例将返回Monster的实例,而不是构造函数

我想那只是我选择哪一个的问题。谢谢你为我们提供了公平的竞争环境!我想那只是我选择哪一个的问题。谢谢你为我们提供了公平的竞争环境!虽然sp00m回答了我前面的问题,但您的回答包含了我感兴趣的“事后”信息。我非常感谢您提供的示例,因为它确实回答了我关于这两项服务之间差异的一个总体问题。虽然sp00m回答了我前面的问题,但您的回答包含了我感兴趣的“事后”信息。我非常感谢您提供的示例,因为它确实回答了我关于这两种服务之间差异的一个总体问题。