이 블로그 게시물 에서 정확한 문제를 해결하려고 했습니다. .
기본적으로 데이터 모델링을위한 최상의 홈은 서비스 및 공장입니다. 그러나 데이터를 검색하는 방법과 필요한 동작의 복잡성에 따라 구현 방법은 다양합니다. 각도는 현재 표준 이 없습니다 방법이나 모범 사례 .
이 게시물은 $ http , $ resource 및 Restangular를 사용하는 세 가지 접근 방식을 다룹니다. .
다음은 각각에 대한 예제 코드입니다. getResult()
은 작업 모델에 메소드 .
Restangular (쉬운 peasy) :
angular.module('job.models', [])
.service('Job', ['Restangular', function(Restangular) {
var Job = Restangular.service('jobs');
Restangular.extendModel('jobs', function(model) {
model.getResult = function() {
if (this.status == 'complete') {
if (this.passed === null) return "Finished";
else if (this.passed === true) return "Pass";
else if (this.passed === false) return "Fail";
}
else return "Running";
};
return model;
});
return Job;
}]);
$ 리소스 (약간 더 복잡하다) :
angular.module('job.models', [])
.factory('Job', ['$resource', function($resource) {
var Job = $resource('/api/jobs/:jobId', { full: 'true', jobId: '@id' }, {
query: {
method: 'GET',
isArray: false,
transformResponse: function(data, header) {
var wrapped = angular.fromJson(data);
angular.forEach(wrapped.items, function(item, idx) {
wrapped.items[idx] = new Job(item);
});
return wrapped;
}
}
});
Job.prototype.getResult = function() {
if (this.status == 'complete') {
if (this.passed === null) return "Finished";
else if (this.passed === true) return "Pass";
else if (this.passed === false) return "Fail";
}
else return "Running";
};
return Job;
}]);
$ http (하드 코어) :
angular.module('job.models', [])
.service('JobManager', ['$http', 'Job', function($http, Job) {
return {
getAll: function(limit) {
var params = {"limit": limit, "full": 'true'};
return $http.get('/api/jobs', {params: params})
.then(function(response) {
var data = response.data;
var jobs = [];
for (var i = 0; i < data.objects.length; i ++) {
jobs.push(new Job(data.objects[i]));
}
return jobs;
});
}
};
}])
.factory('Job', function() {
function Job(data) {
for (attr in data) {
if (data.hasOwnProperty(attr))
this[attr] = data[attr];
}
}
Job.prototype.getResult = function() {
if (this.status == 'complete') {
if (this.passed === null) return "Finished";
else if (this.passed === true) return "Pass";
else if (this.passed === false) return "Fail";
}
else return "Running";
};
return Job;
});
블로그 게시물 자체는 컨트롤러에서 모델을 사용하는 방법에 대한 코드 예제뿐만 아니라 각 접근 방식을 사용해야하는 이유에 대한 자세한 내용을 제공합니다.
AngularJS 데이터 모델 : $ http VS $ resource VS Restangular
Angular 2.0은 모든 사람들이 같은 페이지에있는 데이터 모델링에 대한보다 강력한 솔루션을 제공 할 가능성이 있습니다.