繁体   English   中英

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

[英]Proper way for defining services and factories in AngularJS

我阅读了一些有关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;
});
  1. 这两种方法有什么区别?
  2. 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定义其方法和属性。

  1. 有什么缺点吗?
  2. 为什么我偏爱一种方法?

第三个区别在于定义这样的服务:

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

在这里,我仅看到一个缺点,即私有变量不能与其他函数共享。 但是这种方法有什么大的优点吗? 我可以想象对于工厂(而不是服务),性能会更好,因为原型函数只需要定义一次,而不是每次创建新对象时都定义一次(因为服务是单例的,工厂不是)。


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

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

在使用工厂时,我正在编写new User(data) data与一些默认变量等合并。您如何看待这种方法? 有很大的缺点吗? 还是我以错误的方式使用工厂?

我认为,您所要求的大部分内容以及您认为它做得不同的原因是,这些都是风格上的差异,完全是合法的JavaScript。 这里没有真正的最佳实践。

第一个问题-它没有区别。

第二个问题-都起作用,我对第一个问题有强烈的个人偏好,因为它更灵活; 您可以通过这种方法来实现一些漂亮的技巧,例如对象操作之类的东西。 您可能可以对它们全部进行“ this”操作,但对我而言,这是不必要的。 再次,个人喜好。

第三个问题-这只是JavaScript的一项功能,它支持一流的功能 这只是一种语言功能,将取决于您喜欢如何设计事物。 我内联它们,但将每个服务保留在自己的文件中。 我认为您看到人们这样做是因为有关服务Angular文档显示了他们这样做的原因,因为它更易于阅读文档。 但这并没有太大的不同。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM