【问题标题】:Grails accessing controller values from viewGrails 从视图中访问控制器值
【发布时间】:2012-06-08 19:27:08
【问题描述】:

我对 Grails 还很陌生,所以请多多包涵。

我的视图有这样的javascript代码:

//js code in my View
function validateEmailAndSetEmail(){
    var result =${remoteFunction(controller:'myController',action:'validateEmail',update:'responseDiv', params:'\'email=\'+document.getElementById(\'email\').value')};

    if (result) { //doSomething}
}

我的控制器看起来像:

def validateEmail = {
    def emailToValidate = request.getParameter("email")
    def matchingEmailFound = myService.checkEmailAddress(emailToValidate)

    if (matchingEmailFound){
        render "This email is already in use.<br>If you have already created an account with this email, please try to reset the password from Login page."}
    else{
        //setEmail to send here
        render "This email is not in use. This email will be used as your account email"}

    return !matchingEmailFound

我的问题分为两部分:

  1. 当我在 firebug 的 js 代码中检查 result 的值时,它是 不是布尔类型(真/假)并且该值似乎不正确,是否有任何方法可以传递此值 正确地从控制器视图中的 js?

  2. 我可以调用 set email value 到某个变量 在我看来,控制器并在 js 之外调用它?

提前致谢。

【问题讨论】:

    标签: javascript ajax grails view controller


    【解决方案1】:

    请记住,Ajax 是异步的 - 您的 if(result) 在远程调用发送后立即执行,而不是在它完成时执行。

    更好的方法是更改​​控制器操作以返回一些 JSON 数据:

    def model = [matchFound:matchingEmailFound]
    if(matchingEmailFound) {
      model.message = "This email is already in use.<br>If you have already created an account with this email, please try to reset the password from Login page."
    } else {
      model.message = "This email is not in use. This email will be used as your account email"
    }
    render (model as JSON)
    

    然后在客户端使用onSuccess 函数而不是更新。

    ${remoteFunction(controller:'myController',action:'validateEmail',
       params:'\'email=\'+document.getElementById(\'email\').value', onSuccess:'checkEmail(e)')};
    

    并定义

    function checkEmail(response) {
      var r = JSON.parse(response.text);
      $('responseDiv').innerHTML = r.message;
      if(r.matchFound) {
        // do stuff
      }
    }
    

    我不是 JavaScript 专家,但你懂的。

    【讨论】:

    • 谢谢,效果很好。除了我改变了 $('responseDiv').innerHTML = r.message; to var r = eval('('+response.responseText+')');
    • var r = JSON.parse(response.text); to var r = eval('('+response.responseText+')');
    • 和 $('responseDiv').innerHTML = r.message;到 $('responseDiv').update(r.message);
    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多