从视图访问控制器值的 Grails

Grails accessing controller values from view

本文关键字:Grails 控制器 访问控制 视图 访问      更新时间:2023-09-26

我对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代码中的结果值时,它是不是布尔类型(真/假),值似乎不正确,有没有办法传递这个值从控制器的视图中正确转换为JS?

  2. 我可以将设置电子邮件值调用到某个变量吗控制器,在我看来,它在 js 之外调用它?

提前谢谢。

Remeber 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 专家,但你明白了。