Saya sudah mencoba untuk mengatasi masalah yang tepat di posting blog ini .
Pada dasarnya, rumah terbaik untuk pemodelan data adalah di layanan dan pabrik. Namun, tergantung pada bagaimana Anda mengambil data Anda dan kompleksitas perilaku yang Anda butuhkan, ada banyak cara berbeda untuk menerapkannya. Angular saat ini tidak memiliki cara standar atau praktik terbaik.
Posting ini mencakup tiga pendekatan, menggunakan $ http , $ resource , dan Restangular .
Berikut ini beberapa contoh kode untuk masing-masing, dengan getResult()
metode khusus pada model Pekerjaan:
Restangular (peasy mudah):
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 (sedikit lebih berbelit-belit):
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;
});
Posting blog itu sendiri menjadi lebih rinci tentang alasan di balik mengapa Anda mungkin menggunakan setiap pendekatan, serta contoh kode tentang cara menggunakan model dalam pengontrol Anda:
Model Data AngularJS: $ http VS $ resource VS Restangular
Ada kemungkinan Angular 2.0 akan menawarkan solusi yang lebih kuat untuk pemodelan data yang membuat semua orang di halaman yang sama.