AngularJS – 处理手动input的URL的最佳方式

我目前有一个基于meanjs stack样板的设置,我可以让用户login处于“已login”状态,在我浏览网站的URL时停留。 这是因为将用户对象保存在全局可用的服务中。

然而,这只适用于如果我从我的根目录,即从'/'和只在我的应用程序内导航。

如果我手动input“/ page1”这样的URL,它会丢失全局用户对象,但是如果我进入我的根主页并通过站点导航到“/ page1”。 那很好,它看到Service对象中的全局用户对象。

所以我想这是由于整个页面刷新失去了全球价值,通过网站导航不刷新,所以你保留所有的variables。

有些事情要注意:

  1. 我启用了HTML5Mode,使用“!”的前缀。
  2. 我使用UI-Router
  3. 我使用“/”标签
  4. 我有一个重写规则,在加载所有路由之后,我有一条最后一条路线,它将所有的'/ *'发回并返回根index.html文件,因为这是angularjs的东西。

我只是想知道人们通常在这里做什么? 他们是否还原了标准Cookie和本地存储解决scheme? 我相当新的angular度,所以我猜测有这样的图书馆。

我只是想知道推荐的方式来处理这个问题,或者大多数人做什么,只是让我以正确的方式和angular度的方式alignment。

更新:

如果我通过地址栏手动导航到我的网站上的另一个URL,我失去了我的用户状态,但是如果我通过地址栏手动回到我的根,我的用户状态再次被看到,所以它不是简单地关于状态在窗口刷新。 所以它似乎与在根URL上运行的代码有关。

我有一个明确的重写,手动input的URL(由于HTML5的位置模式)应返回index.html,因为它包含AngularJs文件,然后UI路由接pipe并适当地路由它。

所以我会预料到根目录上的任何代码都会执行,所以它应该类似于通过网站导航或在地址栏中input。 我必须错过一些有关Angular的东西,

更新2

正确的调查导致我:

<script type="text/javascript"> var user = {{ user | json | safe }}; </script> 

哪个是index.html的服务器端代码,我猜这不是通过手动URL刷新页面到新页面时运行的。

使用散列爆炸模式,它的工作原理,这是因为使用散列爆炸模式,即使我在浏览器中键入一个URL,它不会导致刷新,在使用HTML5模式,它刷新。 所以现在我能想到的解决scheme是使用sessionStorage。

除非有更好的select?

更新3:

在使用HTML5Mode的时候,处理这个问题似乎是最好的方法,那就是你只需要在express服务器上重写一些东西。

我认为你是对的,但你可能想看看你的应用程序可能需要的所有路线,并考虑一些基本的结构(API,用户,会话,部分等)。 它只是看起来像你想让它变得如此复杂的问题之一。

就最佳实践而言,您可以遵循angular-fullstack-generator或者meanio项目。

你在做什么看起来最接近mean.io主要是因为他们也使用ui路由器,虽然他们似乎保持hashbang,它看起来像更友好的SEO一些独立的SPA页面的能力。 你可以在我这里解释之前安装它并find代码,

 npm install -g meanio mean init name cd [name] && npm install 

angular-fullstack看起来像这样,这是一个更典型的路由的一个很好的例子:

 // Server API Routes app.route('/api/awesomeThings') .get(api.awesomeThings); app.route('/api/users') .post(users.create) .put(users.changePassword); app.route('/api/users/me') .get(users.me); app.route('/api/users/:id') .get(users.show); app.route('/api/session') .post(session.login) .delete(session.logout); // All undefined api routes should return a 404 app.route('/api/*') .get(function(req, res) { res.send(404); }); // All other routes to use Angular routing in app/scripts/app.js app.route('/partials/*') .get(index.partials); app.route('/*') .get( middleware.setUserCookie, index.index); 

部分然后发现与一些正则expression式为了简单和交付而不像:

 var path = require('path'); exports.partials = function(req, res) { var stripped = req.url.split('.')[0]; var requestedView = path.join('./', stripped); res.render(requestedView, function(err, html) { if(err) { console.log("Error rendering partial '" + requestedView + "'\n", err); res.status(404); res.send(404); } else { res.send(html); } }); }; 

索引被渲染:

 exports.index = function(req, res) { res.render('index'); }; 

最后,我确实遇到了一些麻烦,但是通过做一些可以分解成步骤的东西来解决这个问题,这些步骤适用于那些使用HTML5Mode的人。

1)在Angular中启用HTML5Mode之后,在您的服务器上设置一个重写,以便它返回包含Angular src js文件的index.html。 注意,这个重写应该在你的静态文件和普通的服务器路由之后(例如在你的REST API路由之后)。

2)确保angular度路由与您的服务器路由不一样。 所以,如果你有一个前端的状态/用户/帐户,那么没有服务器路由/用户/帐户,否则将不会被调用,改变你的服务器端路由到/ api / v1 /服务器/路由。

3)对于前端的所有定位标记,无需通过Angular状态/path,直接触发服务器,请确保添加了“target = _self”。