Estaba leyendo este artículo: http://eviltrout.com/2013/06/15/ember-vs-angular.html
Y decía:
Debido a su falta de convenciones, me pregunto cuántos proyectos angulares se basan en malas prácticas, como llamadas AJAX directamente dentro de los controladores. Debido a la inyección de dependencia, ¿los desarrolladores están inyectando parámetros de enrutador en las directivas? ¿Los desarrolladores novatos de AngularJS van a estructurar su código de una manera que un desarrollador experimentado de AngularJS cree que es idiomático?
Realmente estoy haciendo $http
llamadas desde mi controlador Angular.js. ¿Por qué es una mala práctica? ¿Cuál es la mejor práctica para hacer $http
llamadas entonces? ¿y por qué?
Respuestas:
EDITAR: Esta respuesta se centró principalmente en la versión 1.0.X. Para evitar confusiones, se está cambiando para reflejar la mejor respuesta para TODAS las versiones actuales de Angular a partir de hoy, 2013-12-05.
La idea es crear un servicio que devuelva una promesa a los datos devueltos, luego llame a eso en su controlador y maneje la promesa allí para completar su propiedad $ scope.
El servicio
El controlador:
Maneje el
then()
método de la promesa y obtenga los datos de él. Establezca la propiedad $ scope y haga lo que sea que necesite hacer.Resolución de promesa a la vista (solo 1.0.X):
En Angular 1.0.X, el objetivo de la respuesta original aquí, las promesas recibirán un tratamiento especial por parte de la Vista. Cuando se resuelven, su valor resuelto estará vinculado a la vista. Esto ha quedado en desuso en 1.2.X
fuente
$scope.foos
propiedad en una plantilla. Si tuviera que usar esa misma propiedad fuera de una plantilla (por ejemplo, en otra función), el objeto almacenado allí sigue siendo un objeto de promesa..then()
la promesa y poner el valor en $ alcance ...myService.getFoos().then(function(value) { $scope.foos = value; });
La mejor práctica sería abstraer la
$http
llamada en un 'servicio' que proporciona datos a su controlador:Si abstrae la
$http
llamada de esta manera, podrá reutilizar este código en varios controladores. Esto se hace necesario cuando el código que interactúa con estos datos se vuelve más complejo, tal vez desee procesar los datos antes de usarlos en su controlador y almacenar en caché el resultado de ese proceso para que no tenga que perder tiempo volviéndolo a procesar.Debe pensar en el 'servicio' como una representación (o Modelo) de datos que su aplicación puede usar.
fuente
La respuesta aceptada me estaba dando el
$http is not defined
error, así que tuve que hacer esto:La principal diferencia es esta línea:
fuente
Puse una respuesta para alguien que quería un servicio web totalmente genérico en Angular. Recomiendo simplemente enchufarlo y se encargará de todas sus llamadas al servicio web sin necesidad de codificarlas usted mismo. La respuesta está aquí:
https://stackoverflow.com/a/38958644/5349719
fuente