实例讲解

下面是coffee/SSO/auth.coffee的部分代码:

modal = (html, color, id, callback)->
    $.modal(
        html
        {
            dimmerClassName : 'form '+color
        }
        id
        callback
    )
$.SSO.auth = {
    password_set_mail: (mail)->
        self = modal(
            __inline("/html/coffee/SSO/password_set_mail.html")
            "purple"
            "ssoAuthPasswordSetMail"
            (elem)->
                error_tip = $.error_tip(elem)
                m = {
                    o:{
                        mail
                    }
                    submit : ->

                        error={}

                        if m.o.mail.indexOf("@") <= 0
                            error.mail = "请输入有效的邮箱地址"

                        if not error_tip.set error
                            AV.User.requestPasswordReset( m.o.mail, {
                                success: ->
                                    href="http://"+m.o.mail.split("@")[1]
                                    $.modal_alert """<h1><p><span style="padding-right:30px;">重置密码邮件已发送。</span><a target="_blank" href="#{href}">点此查看</a></p><p>没有收到?<a class="resend" style="padding-left:30px;cursor:wait;" href="javascript:void(0)">点此重新发送<span class="timer"></span></a></p></h1>""", {
                                                onApprove:->
                                                    location.href="/"
                                                onShow:->
                                                    resend = $(@).find(".resend")
                                                    timer = resend.find(".timer")
                                                    run = ->
                                                        c = 60
                                                        counter =->
                                                            if c == 0
                                                                clock = ""
                                                                resend.click send
                                                                resend.css {cursor:"pointer",color:""}
                                                            else
                                                                c-=1
                                                                clock = "(#{c})"
                                                                setTimeout(counter,1000)
                                                            timer.text clock
                                                        counter()
                                                        resend.css {color:'#444'}
                                                    send = ->
                                                        AV.User.requestPasswordReset(m.o.mail, {})
                                                        resend.unbind 'click'
                                                        run()

                                                    run()

                                            }
                                error: (_error) ->
                                    if _error.code == 205
                                        error.mail = "该账号不存在"
                                    else
                                        error.mail = _error.message
                                    error_tip.set error
                            })
                        false
                }
        )
}

其中$.SSO.auth.password_set_mail是实现发送重置密码邮件的方法

该方法中调用了modal()函数,modal()函数在文件的开始定义,用于显示弹出窗。该调用分别传了__inline(“/html/coffee/SSO/password_set_mail.html”),”purple”,”ssoAuthPasswordSetMail”和一个回调函数这四个参数。第一个参数是个内嵌的html,用了fis的写法;第二个参数是一个class名的一部分;第三个参数是View的id名;最后的回调函数是该方法的主体。m对象作为avalon的View方法的第二个参数传进。m中包括对象o和方法submit,对象o即为View中的变量,用于avalon变量绑定,submit()作为提交函数定义。submit()中的AV.user.requestPasswordReset函数用于LeanCloud向用户的Email地址发送重置密码邮件,它接收一个email地址字符串,一个包含成功和错误回调函数的对象。发送成功后,success方法执行,我们用$.modal_alert来提示发送成功,弹出框里我们可以点击链接查看邮箱网站,也可以点击链接重新发送重置密码邮件。重发邮件每隔1分钟可点击一次,该部分效果写在onshow方法里。如果发送邮件失败,error方法执行,接收参数_error(加下划线用于区分error,error用于定义错误提示对象,在一定的情况下显示一定的错误信息。),然后根据错误提示码显示出错提示信息,其中$.error_tip()用于提示出错。