Мъчих се да разбера "ъгловия" начин на работа за използване на фабрики за представяне на ajax данни (правя много споделяния между контролери, използвайки config). Направих задълбочено проучване и всички отговори изглежда попадат в две категории:
- Използвайте фабриката, за да представите данните, след това в контролера извлечете данните и актуализирайте фабриката:
{не е предназначен да бъде действително работещ ъглов
var app = angular.module('main', [])
app.factory('data', function($http){
var data = []
return data
})
app.controller('cntrl', [$scope, $http, data]){
$scope.data = data
$http.get('/data').success(
function(idata){
$scope.data = idata
)
}
Използвайте фабриката, за да представите http заявка с обещание и след това присвоете тези данни на $scope
var app = angular.module('main', []) app.factory('data', function ($http, $q){ var factory = {}; factory.getdata = function(){ var defer = $q.defer(); $http.get('/data').success(function(idata) { defer.resolve(idata); }) return defer.promise; } return factory; }); app.controller('cntrl', [$scope, data]){ $scope.data = [] data.getdata().then(function(idata) { $scope.data = idata }); }
Имам няколко проблема с това, в първата категория фабриката изглежда мега куца и сякаш не добавя много стойност и всеки контролер трябва да има кода, за да манипулира фабриката. С втория контролер фабриката е много сложна и всъщност не съхранява данните (за споделяне между контролери), просто представлява дълъг начин за писане на http.get
Въпросът ми е следният: Как мога да използвам фабрика, за да представя моите данни и да управлявам манипулирането на тези данни по чист начин? Това, което бих искал да направя, е нещо подобно:
var app = angular.module('main',[])
app.factory('data', function($http){
var factory = {}
factory.data = []
factory.initialise = function(){
$http.get('/data').success(
function(data){
factory.data = data
}
)
}
return factory
})
app.controller('cntrlA', [$scope, data]) {
$scope.data = data.data
$data.initialise()
}
app.controller('cntrlB', [$scope, data]) {
$scope.data = data.data
}