发送$ http.get两次

编辑1:伙计们,我注意到我在我的authentication工厂调用$ http.get('/ posts')(用于某些特殊用途)。 对不起,这个愚蠢的问题。 当赏金结束时我会删除它。

我有以下代码来加载页面https://localhost:3000/#/home ,它从数据库中获取所有post并显示它们。

问题是,我意识到日志router.get /posts是打印两次,而herethere只提醒一次。

有谁知道这是否意味着$http.get被执行两次? 如果是的话,问题在哪里?

 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) { ... ... 

在后端:

 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); }); }); 

PS:我刚刚意识到一件事:我已经在网站上设置了login和注销。 当我没有login时, https://localhost:3000/#/home只显示一次router.get /posts ; 当我login时提出问题。

既然你说当你login的时候发生了这个问题…这是因为你使用angular-ui-router这个事件是非常重要的。

 $stataChangeStart(...) , and $stateChangeSuccesss(...) 

请通知您正在使用的解决scheme

 .state('global.home', { url: '/home', templateUrl: '/htmls/home.html', controller: 'MainCtrl', resolve: { postPromise: ['posts', function (posts) { return posts.getAll(); }] } }) 

在跳转发生在目标url之前首先被parsing,然后视图被更改/更新。

一个解决scheme是:

请确保在您尝试首先login后才能检查“&&”条件,然后获取数据。

如果您使用的是angular度ui路由器版本0.12,请升级版本,以便解决问题。 谢谢。