Rails+AngularJS 从登陆漫谈Session以及Promise
分几篇写太麻烦了,这是Rails+AngularJS坑中的最后一篇,我们讲讲Rails中的Session以及AngularJS中的Promise。
Rails+AngularJS自己折腾是因为教程写的又臭又长,而且不是中文,我在想,我只是把Rails当做一个Api,是不是根本用不着那么多麻烦,不就是传个json出来么?
Yes,That's right.
我们来回忆一下:Rails 实现用户登录存取Session思路总结当时篇尾戏剧性的变化,这次看的是http://guides.ruby-china.org,效果好很多,需要什么直接去查。
因此我们其实只是需要一个SESSION啊!
那么大家懂了,直接在controller里这么写就行了:
def login
_login = session[:login] = true
if _login
render :json=>{"login" => true}.to_json
else
render :json=>{"login" => false}.to_json
end
end
后端部分成功搞定(Router请参考:Rails 处理跨站请求)
那么你可以看到这篇讲的大部分都不是Session,而是Promise了。
我们需要将收到的请求进行处理,定义了一个check_login的url。
第一个问题就是,如何修改不同的登录状态下显示不同的字,DOM?——No!
作为一个写惯了jQuery的人,第一反应永远是jQuery。但是我们要从后端的角度去理解AngularJS,把这个考虑成一个变量,就能得出结论了。
$scope.loginMessage.login_title = login ? 'Logout' : 'Login';
相信大家都能知道接下来需要做什么——在View也就是Html文件里把这个输出即可。
好了,问题2,我们如何同步登录状态到View。
要实现Ajax的效果,很明显我们需要在登录时show掉很多东西,在没登录时删除。remove()
?不是。
首先我们需要知道有个叫ng-if
的attr,它可以保证你的显示与否,效果跟remove一样,如果是控制视觉上的效果,是show和hide。
ng-if
为true
时,才会显示相应的元素。
现在我们知道怎么通过Angular的思路来解决这个问题了。
换句话说我们应该要由一个变量或者返回值来控制改变。
我们知道,Ajax是异步的,换句话说,妄图返回值已经是异想天开了,改成同步的就更坑了而且没有给我这个机会啊!(行,其实昨天在这里又被坑了,直到最后突然想到这个问题)。
那么我们还剩下的选择是什么——直接调用值啊!
其实那个时候查到了一个Promise,虽然之后知道并没有什么卵用,但还是了解了一下异步队列的解决方案(所以和我们的并没有什么关系)。
我们在使用$http
中并不需要使用Promise,因为他就是基于Promise的,所以Promise的所有东西他都可以用。实际上,Promise是一个解决方案,而不是Angular特有的概念:
http://echizen.github.io/tech/2015/08-08-learn-promise/
http://blog.lxjwlt.com/front-end/2015/06/23/angularjs-promise.html
详细可以看上面两篇,这是一个被封装好的非常简单的队列机制。
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。