簡體   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