Jaka jest najlepsza praktyka wykonywania połączenia AJAX w Angular.js?
Czytałem ten artykuł: http://eviltrout.com/2013/06/15/ember-vs-angular.html
I powiedział:
[[2]}wykonujęZe względu na brak konwenansów, zastanawiam się, ile kanciastych projektów polegać na złych praktykach, takich jak wywołania AJAX bezpośrednio w kontrolerach? Ze względu na iniekcję zależności, czy deweloperzy wstrzykują router parametry w dyrektywach? Czy początkujący Programiści AngularJS będą struktura ich kodu w sposób, który doświadczony programista AngularJS wiara jest idiomatyczna?
$http
telefony z mojego kątowego.kontroler js. Dlaczego jest to zła praktyka? Jaka jest zatem najlepsza praktyka wykonywania $http
połączeń? i dlaczego? 4 answers
EDIT: ta odpowiedź skupiała się głównie na wersji 1.0.X. Aby zapobiec zamieszaniu, został zmieniony, aby odzwierciedlić najlepszą odpowiedź dla wszystkich obecnych wersji Angular na dzień dzisiejszy, 2013-12-05.
Chodzi o stworzenie usługi, która zwróci obietnicę do zwróconych danych, a następnie wywoła ją w kontrolerze i obsłuży tam obietnicę, aby wypełnić właściwość $scope.
Serwis
module.factory('myService', function($http) {
return {
getFoos: function() {
//return the promise directly.
return $http.get('/foos')
.then(function(result) {
//resolve the promise as the data
return result.data;
});
}
}
});
Kontroler:
Obsługiwać metodę then()
obietnicy i wyciągnij z niego dane. Ustaw właściwość $ scope i zrób wszystko, co może być konieczne.
module.controller('MyCtrl', function($scope, myService) {
myService.getFoos().then(function(foos) {
$scope.foos = foos;
});
});
In-View Promise Resolution (1.0.Tylko X):
In Angular 1.0.X, cel oryginalnej odpowiedzi tutaj, obietnice otrzyma specjalne traktowanie przez Widok. Gdy zostaną rozwiązane, ich rozwiązana wartość zostanie powiązana z widokiem. to zostało wycofane w 1.2.X
module.controller('MyCtrl', function($scope, myService) {
// now you can just call it and stick it in a $scope property.
// it will update the view when it resolves.
$scope.foos = myService.getFoos();
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-16 04:58:29
Najlepszą praktyką byłoby abstrakcyjne wezwanie $http
do "usługi", która dostarcza dane administratorowi:
module.factory('WidgetData', function($http){
return {
get : function(params){
return $http.get('url/to/widget/data', {
params : params
});
}
}
});
module.controller('WidgetController', function(WidgetData){
WidgetData.get({
id : '0'
}).then(function(response){
//Do what you will with the data.
})
});
Abstrakcja wywołania $http
w ten sposób pozwoli na ponowne użycie tego kodu w wielu kontrolerach. Staje się to konieczne, gdy kod, który współdziała z tymi danymi, staje się bardziej złożony, być może chcesz przetworzyć dane przed użyciem ich w kontrolerze i buforować wynik tego procesu, dzięki czemu nie będziesz musiał tracić czasu Na ponowne przetwarzanie to.
Powinieneś myśleć o "usłudze" jako o reprezentacji (lub modelu) danych, z których może korzystać Twoja aplikacja.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-15 03:37:19
Zaakceptowana odpowiedź dawała mi błąd $http is not defined
więc musiałem to zrobić:
var policyService = angular.module("PolicyService", []);
policyService.service('PolicyService', ['$http', function ($http) {
return {
foo: "bar",
bar: function (params) {
return $http.get('../Home/Policy_Read', {
params: params
});
}
};
}]);
Główną różnicą jest ta linia:
policyService.service('PolicyService', ['$http', function ($http) {
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-20 19:16:28
Umieściłem odpowiedź dla kogoś, kto chciał całkowicie ogólny serwis internetowy w Angular. Polecam po prostu podłączyć go i zajmie się wszystkimi połączeniami z usługami sieciowymi bez konieczności kodowania ich wszystkich samodzielnie. Odpowiedź jest tutaj:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:17