Ich habe versucht, genau dieses Problem zu lösen in dieser Blogbeitrag .
Grundsätzlich ist das beste Zuhause für die Datenmodellierung in Diensten und Fabriken. Je nachdem, wie Sie Ihre Daten abrufen und wie komplex das benötigte Verhalten ist, gibt es jedoch viele verschiedene Möglichkeiten, die Implementierung vorzunehmen. Angular hat derzeit keine Standard Weg oder die beste Praxis.
In diesem Beitrag werden drei Ansätze behandelt, und zwar $http , $Ressource y Restangular .
Hier ist ein Beispielcode für beide, mit einer benutzerdefinierten getResult()
Methode für das Modell Job:
Restangular (kinderleicht):
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;
}]);
$resource (etwas umständlicher):
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 (hardcore):
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;
});
Der Blogbeitrag selbst geht näher auf die Gründe für die Verwendung der einzelnen Ansätze ein und enthält Codebeispiele für die Verwendung der Modelle in Ihren Controllern:
AngularJS Datenmodelle: $http VS $resource VS Restangular
Es besteht die Möglichkeit, dass Angular 2.0 eine robustere Lösung für die Datenmodellierung bietet, die alle Beteiligten auf dieselbe Seite bringt.