[英]adding behavior to javascript objects in angular
我是剛開始使用angular的人,並且對將行為添加到angular中的對象有疑問。
我有一種情況,我得到一個對象或對象數組說使用$http
var person =
{
id : 123,
firstname : "james",
lastname : "bond",
username : "james00",
profileGuid : "DSKFSJKFBSFBJBSFKJBAKBDS",
projects : [
{
id : 1,
name : "gold finger"
}
]
}
我想添加類似的行為
var spyBehavior =
{
greet : function(){
return this.lastname + " " + this.firstName + " " + this.lastName;
},
hasExperience : function(){
this.projects && this.projects.length && this.projects.length > 0
}
}
目前,我使用angular.extend(person, spyBehavior)
spyBehavior
對象添加行為的利弊是什么? this
的引用 我認為您想要的是某種模型。 因為服務是單例的,所以我總是以以下方式將模型定義為工廠。
angular.module('myApp').factory('User', function() {
var _greet = function() {
console.log("hello");
};
var User = function(data) {
angular.extend(this, {
email: null,
name: null
greet: _greet
}, data);
};
return User;
});
然后,您可以在所需的任何模塊中注入用戶“模型”。 如果要獲取該模型的新實例,只需執行
var user = new User(data);
遵循單一責任方法,此對象有點愚蠢。 它只知道它是自己的屬性,如何處理它們等等。 如果要添加一些行為,例如通過$http
更新此對象,只需將$http
服務注入到User模型中,然后執行所需的操作即可。 只要確定,不要與其他模型建立不必要的依賴關系。
我用來在Factory提供程序中定義原型對象:
angular.module('MyApp').factory('SpyBehaviour', function(){
var SpyBehaviour = {
greet : function(){
return this.lastname + " " + this.firstName + " " + this.lastName;
},
hasExperience : function(){
this.projects && this.projects.length && this.projects.length > 0
}
};
return SpyBehaviour;
});
然后,用原型創建一個新對象,並使用$ http服務的結果對其進行擴展。 如果使用transformResponse
函數 ,則$http
Promise將與擴展對象一起解決。
$http.({
method: 'GET',
url: '/persons',
transformResponse: function (data) {
var persons = JSON.parse(data);
return persons.map(function (person) {
return angular.extend(
Object.create(SpyBehaviour),
person
);
});
}
});
如果要從HTTP后端檢索模型,則AngularJS具有一個很酷的功能,稱為transformResponse
。 您可以為特定的$http
調用指定transformResponse
函數。 該函數將接收來自http請求的響應作為參數,根據您的實現對其進行操作,然后將其返回。 當然,由於angular $resource
是建立在$http
之上的,因此您可以在兩者中使用transformResponse
。
簡而言之,如果您想接待一群人並用一些功能來裝飾它,這就是我要做的:
People
$resource
; transformResponse
參數。 您完成了。 在請求結束時您將得到一系列具有附加功能的人員。 您可以使用簡單的$http
請求執行完全相同的操作,可以用相同的方式指定transformResponse
屬性。
另請參閱此簡短的egghead.io教程 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.