Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在AngularJS中定义服务和工厂的正确方法_Javascript_Angularjs - Fatal编程技术网

Javascript 在AngularJS中定义服务和工厂的正确方法

Javascript 在AngularJS中定义服务和工厂的正确方法,javascript,angularjs,Javascript,Angularjs,我读了一些AngularJS的教程,注意到每个人都在使用一种稍微不同的方法来定义服务。我想知道什么是最好的方法,或者在使用特定方法时会出现什么缺点 我注意到的第一个区别是使用匿名函数或命名函数: angular.module('myApp').service('myService', function myService() { var _var1 = "foo"; var public_methods = { doSomething: function() { re

我读了一些AngularJS的教程,注意到每个人都在使用一种稍微不同的方法来定义服务。我想知道什么是最好的方法,或者在使用特定方法时会出现什么缺点

我注意到的第一个区别是使用匿名函数或命名函数:

angular.module('myApp').service('myService', function myService() {
  var _var1 = "foo";
  var public_methods = {
    doSomething: function() {
      return "bar";
    },
    var1: _var1
  };
  return public_methods;
});

angular.module('myApp').service('myService', function() {
  var _var1 = "foo";
  var public_methods = {
    doSomething: function() {
      return "bar";
    },
    var1: _var1
  };
  return public_methods;
});
  • 这两种方法有什么区别吗
  • angular是否提供
    myService
    命名功能?怎么做

  • 第二个不同之处在于定义“公共方法”,例如外部可见的:

    angular.module('myApp').service('myService', function myService() {
      var _var1 = "foo";
      var public_methods = {
        doSomething: function() {
          return "bar";
        },
        var1: _var1
      };
      return public_methods;
    });
    
    angular.module('myApp').service('myService', function myService() {
      var _var1 = "foo";
      this.doSomething = function() {
        return "bar";
      };
      this.var1 = _var1
    });
    
    第一个函数返回一个对象,该对象的行为类似于一个接口,并定义了对公众可见的内容。第二个,使用
    this
    定义其方法和属性

  • 有什么缺点吗
  • 为什么我更喜欢一种方法而不是另一种

  • 第三个区别在于定义如下服务:

    var Session = function() {};
    Session.prototype.doSomething = function() {
      return "bar";
    };
    Session.prototype.var1 = "foo";
    angular.module('myApp').service('myService', Session);
    
    在这里,我只看到一个缺点,即privat变量不能与其他函数共享。但这种方法有什么好处吗?我可以想象,对于工厂(而不是服务),性能会更好,因为原型函数只需定义一次,而不是每次创建新对象(因为服务是单例的,工厂不是)


    定义和使用工厂:我也不确定以下方法是否是使用工厂的最佳实践:

    angular.module('myApp').factory('User', function() {
      var User = function(data) {
        angular.extend(this, {
          id: null,
          email: null,
          name: null
        }, data);
      };
      return User;
    });
    

    在使用工厂时,我正在编写
    新用户(数据)
    <代码>数据与一些默认变量等合并。您如何看待此方法?有很大的缺点吗?还是我使用工厂的方式不对?

    我认为,大体上,你所问的大部分问题——以及你看到它做得不同的原因——都是风格上的差异,都是完全合法的JavaScript。这里没有真正的最佳实践

    第一个问题——没什么区别

    第二个问题——这两个问题都有效,我个人对第一个问题有强烈的偏好,因为它更灵活;你可以用这种方法做一些漂亮的小把戏,对象操纵之类的东西。你也许可以在“这个”上做所有的手术,但我觉得没必要。再次强调个人偏好

    第三个问题——这只是JavaScript支持的一个特性。这只是一个语言特性,最终取决于你喜欢如何设计东西。我将它们内联,但将每个服务保存在自己的文件中。我认为你看到人们这样做是因为它显示了他们这样做,因为在文档中更容易阅读。但其实没什么不同


    我对您如何使用该工厂没有问题,但请确保您实际上不需要$resource

    谢谢大家!!你能用
    $resource
    稍微解释一下这个部分吗?所以,这只是一个基于使用工厂来创建“用户”对象的直观预感。。。这可能根本不适用于你正在做的事情。但是$resource服务允许您创建各种预构建的AJAX/REST/JSON有趣的数据模型,并且可以为您节省大量时间。