Je lisais cet article: http://eviltrout.com/2013/06/15/ember-vs-angular.html
Et il a dit,
En raison de son manque de conventions, je me demande combien de projets Angular reposent sur de mauvaises pratiques telles que les appels AJAX directement dans les contrôleurs? En raison de l'injection de dépendances, les développeurs injectent-ils des paramètres de routeur dans les directives? Les développeurs AngularJS novices vont-ils structurer leur code d'une manière qu'un développeur AngularJS expérimenté juge idiomatique?
Je passe en fait des $http
appels depuis mon contrôleur Angular.js. Pourquoi est-ce une mauvaise pratique? Quelle est alors la meilleure pratique pour passer des $http
appels? et pourquoi?
Réponses:
EDIT: Cette réponse était principalement axée sur la version 1.0.X. Pour éviter toute confusion, il a été modifié pour refléter la meilleure réponse pour TOUTES les versions actuelles d'Angular à compter d'aujourd'hui, le 05/12/2013.
L'idée est de créer un service qui renvoie une promesse aux données renvoyées, puis de l'appeler dans votre contrôleur et de gérer la promesse là-bas pour remplir votre propriété $ scope.
Le service
Le controlle:
Gérez la
then()
méthode de la promesse et extrayez-en les données. Définissez la propriété $ scope et faites tout ce que vous pourriez avoir à faire.Résolution des promesses dans la vue (1.0.X uniquement):
Dans Angular 1.0.X, la cible de la réponse originale ici, les promesses recevront un traitement spécial par la vue. Lorsqu'ils se résolvent, leur valeur résolue sera liée à la vue. Cela a été abandonné dans la version 1.2.X
la source
$scope.foos
propriété dans un modèle. Si vous deviez utiliser cette même propriété en dehors d'un modèle (par exemple dans une autre fonction), l'objet qui y est stocké est toujours un objet de promesse..then()
de la promesse et mettre la valeur dans le $ scope ...myService.getFoos().then(function(value) { $scope.foos = value; });
La meilleure pratique serait d'abstraire l'
$http
appel dans un `` service '' qui fournit des données à votre responsable du traitement:Abstraire l'
$http
appel comme celui-ci vous permettra de réutiliser ce code sur plusieurs contrôleurs. Cela devient nécessaire lorsque le code qui interagit avec ces données devient plus complexe, peut-être souhaitez-vous traiter les données avant de les utiliser dans votre contrôleur, et mettre en cache le résultat de ce processus afin que vous n'ayez pas à passer du temps à les retraiter.Vous devez considérer le «service» comme une représentation (ou modèle) de données que votre application peut utiliser.
la source
La réponse acceptée me donnait l'
$http is not defined
erreur, je devais donc faire ceci:La principale différence étant cette ligne:
la source
J'ai mis une réponse pour quelqu'un qui voulait un service web totalement générique en Angular. Je recommanderais simplement de le brancher et il prendra en charge tous vos appels de service Web sans avoir besoin de tous les coder vous-même. La réponse est ici:
https://stackoverflow.com/a/38958644/5349719
la source