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-iftrue时,才会显示相应的元素。

现在我们知道怎么通过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

详细可以看上面两篇,这是一个被封装好的非常简单的队列机制。

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 知识, 代码段, 语法, Rails, AngularJS

添加新评论