Использовать $rootScope для возврата JSON в AngularJS?
У меня есть эта функция, которая возвращает json
с $scope.product_owners = data
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
$scope.product_owners = data;
});
В настоящее время я вызываю эту функцию во всех моих контроллерах, потому что она используется в них, но мне интересно, можно ли было вызвать один раз. Например, с $rootScope
или что-то типа того.
4 ответа
"Угловой способ" обмена данными между контроллерами заключается в использовании службы:
app.factory('ProductOwners', function ($http) {
var service = {
data: []
};
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
service.data = data;
});
return service;
});
Затем введите сервис в каждый контроллер:
app.controller('someCtrl', function (ProductOwners) {
$scope.product_owners = ProductOwners.data;
});
Другая реализация с "ленивой" оценкой (то есть она выполняет вызов только в случае необходимости и затем обслуживает те же данные):
app.factory('ProductOwners', function ($http, $q) {
var data;
function getDataIfNeeded() {
if (data !== undefined) {
return $q.when(data);
}
return $http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).then(function(response) {
data = response.data;
return data;
});
}
return {
getData: getDataIfNeeded
};
});
app.controller('someCtrl', function (ProductOwners) {
ProductOwners.getData().then(function (data) {
$scope.product_owners = data;
});
});
ОБНОВИТЬ
Еще одна другая реализация с "ленивой" оценкой и поддержкой аргумента, переданного getData()
:
app.factory('GenericService', function ($http, $q) {
var data = {};
function getDataIfNeeded(action) {
action = action || 'default';
if (data[action] !== undefined) {
return $q.when(data[action]);
}
return $http({
url: "php/functions.php",
method: "GET",
params: {
action: action
}
}).then(function(response) {
data[action] = response.data;
return data[action];
});
}
return {
getData: getDataIfNeeded
};
});
app.controller('someCtrl', function (GenericService) {
GenericService.getData("get_product_owners").then(function (data) {
$scope.product_owners = data;
});
});
Если один и тот же код используется несколькими контроллерами в вашем приложении, вы можете поместить его в службу, а затем вызвать его из контроллеров:
myApp.service('products', function($http) {
this.getProductOwners = function(targetScope) {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
targetScope.product_owners = data;
});
};
});
А потом, в ваших контроллерах:
myApp.controller('MyCtrl', function($scope, products) {
products.getProductOwners($scope);
});
Использование сервисов является предпочтительным способом повторного использования кода между несколькими контроллерами.
1- вы можете сделать фабрику и затем вызывать ее при необходимости внутри контроллеров
yourApp.factory('httpFactory', function($http) {
return {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
this.product_owners = data;
});
}}
тогда в основном вы вводите его куда угодно,
yourApp.controller('xCtrl', function (httpFactory) {
$scope.product_owners = httpFactory.product_owners;
});
2 - вы также можете иметь главный контроллер для приложения, как это
<body ng-controller="mainCtrl">
а затем вставьте свой код в это
yourApp.controller('mainCtrl', function($scope, $http) {
$http({
url: "php/functions.php",
method: "GET",
params: {
action: "get_product_owners"
}
}).success(function(data) {
$scope.product_owners = data;
}); }
теперь вы можете получить доступ к этим данным из любой области видимости
Вы можете определенно разместить его на $rootScope
сохранить несколько звонков.
Вопрос в том, можно ли выполнить один вызов на одном контроллере, можно ли перейти к другому представлению / контроллеру и, таким образом, пропустить вызов?
Если ответ нет, то у вас нет проблем.
Если ответ "да", то у вас должен быть контроллер, обертывающий все остальные, чтобы убедиться, что у вас есть эти данные.
Еще одна возможность - иметь службу, чтобы сохранить product_owners
данные, и каждый контроллер может получить доступ к этому серверу для получения данных, и, если они недоступны, получить их по ajax
запрос.