Ich habe versucht, genau dieses Problem in diesem Blog-Beitrag anzugehen .
Grundsätzlich ist das beste Zuhause für die Datenmodellierung in Diensten und Fabriken. Abhängig davon, wie Sie Ihre Daten abrufen und wie komplex die von Ihnen benötigten Verhaltensweisen sind, gibt es viele verschiedene Möglichkeiten, die Implementierung durchzuführen. Angular hat derzeit keine Standardmethode oder Best Practice.
Der Beitrag behandelt drei Ansätze: $ http , $ resource und Restangular .
Hier ist ein Beispielcode für jeden mit einem benutzerdefinierten Code getResult()
Methode für das Jobmodell:
Restangular (leicht 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;
}]);
$ resource (etwas komplizierter):
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 Blog-Beitrag selbst geht detaillierter auf die Gründe ein, warum Sie die einzelnen Ansätze verwenden könnten, sowie auf 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, mit der alle auf dieselbe Seite gelangen.