[英]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;
});
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);
在這里,我僅看到一個缺點,即私有變量不能與其他函數共享。 但是這種方法有什么大的優點嗎? 我可以想象對於工廠(而不是服務),性能會更好,因為原型函數只需要定義一次,而不是每次創建新對象時都定義一次(因為服務是單例的,工廠不是)。
定義和使用工廠:我也不確定,使用工廠時以下方法是否是最佳實踐:
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.