Edición 1: Chicos, me doy cuenta de que llamo a $http.get('/posts') (para algún propósito especial) en mi fábrica de autenticación. Perdón por la estúpida pregunta. Lo eliminaré cuando termine la recompensa.
Tengo el siguiente código para cargar una página https://localhost:3000/#/home , que obtiene todas las publicaciones de la base de datos y las muestra.
El problema es que me doy cuenta de que el registro router.get /posts se imprime dos veces, mientras que here y there solo se alerta una vez.
¿Alguien sabe si significa que $http.get se realiza dos veces? Si es así, ¿dónde está el problema?
app.config(... ...) { $stateProvider .state('global', { templateUrl: '/htmls/global.html', controller: 'GlobalCtrl' }) .state('global.home', { url: '/home', templateUrl: '/htmls/home.html', controller: 'MainCtrl', resolve: { postPromise: ['posts', function (posts) { return posts.getAll(); }] } }); }]); app.factory('posts', ['$http', 'auth', function ($http, auth) { var o = { posts: [] }; o.getAll = function () { alert("before"); return $http.get('/posts').then(function (res) { alert("after"); angular.copy(res.data, o.posts); }) } ... ... }]); app.controller('GlobalCtrl', [function () { }]); app.controller('MainCtrl', ['$scope', 'posts', 'auth', 'postPromise', function ($scope, posts, auth, postPromise) { ... ...En el back-end:
router.get('/posts', function (req, res, next) { console.log("router.get /posts"); Post.find(function (err, posts) { if (err) return next(err); res.json(posts); }); }); PD: Acabo de darme cuenta de una cosa: había configurado un inicio de sesión y un cierre de sesión en el sitio web. Cuando NO estoy conectado, https://localhost:3000/#/home solo se muestra una vez router.get /posts ; el problema surge cuando estoy conectado.
Dado que está diciendo que cuando inicia sesión, ocurre el problema ... esto se debe al hecho de que, dado que está utilizando angular-ui-router, los dos eventos son muy importantes.
$stataChangeStart(...) , and $stateChangeSuccesss(...)Tenga en cuenta que la resolución que está utilizando
.state('global.home', { url: '/home', templateUrl: '/htmls/home.html', controller: 'MainCtrl', resolve: { postPromise: ['posts', function (posts) { return posts.getAll(); }] } })se resuelve primero antes de que ocurra el salto a la URL de destino y luego la vista se cambia/actualiza.
Una de las soluciones es:
Asegúrese de tener la condición '&&' para verificarla aquí, ya que está intentando iniciar sesión primero y luego obtener los datos.
Si está utilizando la versión 0.12 del enrutador angular ui, actualice la versión para que se resuelva el problema. Gracias.