【问题标题】:Variable Variable in GroovyGroovy 中的变量
【发布时间】:2011-03-12 21:04:19
【问题描述】:

我在一个使用 Grails 的项目中,

我使用 beanFields 插件,我将 bean:inputTemplate 更改为以下内容

   <bean:inputTemplate>
    <div class="prop ${hasErrors(bean:$beanName,field:'$fieldId','errors')}">${label}
      <span  class="value">${field}
      </span>
    </div>
  </bean:inputTemplate>

如你所愿,我尝试使用 $beanName 作为 BeanName .. 这是因为 beanFields 将 beanName 和 fieldId 以及其他一些属性传递给 inputTemplate 标记..

但是,问题是我不能这样做..而且我真的很懒,不想花所有时间复制和粘贴相同的字段 div 并为此维护一个巨大的文件...

所以,如果有人能在这种情况下提供帮助,我将非常感激。

我想在 $ { } 代码块中引用一个变量,因为在 PHP 中有 $$variable 使用 $variable 的值作为要评估的变量的名称。

希望我说得够清楚.. 感谢您的帮助。

【问题讨论】:

    标签: grails groovy grails-plugin


    【解决方案1】:

    不是直接回答您的问题,但您看过 bean-fields 插件吗?

    http://grails.org/plugin/bean-fields

    我认为它可以做你想做的事,还有更多

    【讨论】:

      【解决方案2】:

      您不应该在 beanName 前面加上 $,它应该在范围内。

      <div class="prop ${hasErrors(bean:beanName,field:'username','errors')}" >
      

      另外,我认为 beanFields 已经通过 errors 变量提供了错误消息。

      所以你可以测试看看errors是否不为null,而不是调用hasErrors。

      【讨论】:

        【解决方案3】:

        在调查问题后..我发现是的 beanName 被传递给模板,我不需要在 beanName 前面使用 $...

        但是,当我使用 hasErrors(beans:beanName,field:'username','errors') 时,它仍然不起作用。

        但是,我可以这样做

        <bean:inputTemplate>
            <div class="prop">${label}
              <span  class="value">${field}
              </span>
              <g:if test="${errors}"><div class="errors"> ${errors} </div></g:if>
            </div>
          </bean:inputTemplate>
        

        尽管它不起作用,但它取决于域类上的 validate 方法 所以写这个

        if ( ! (userSecurity.validate() && userProfile.validate() && address.validate() && photo.validate() ) ){
                            flash.message = ' Error registering user '
                            render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
                    }else{
                            UserSecurity.withTransaction { status ->
                                    userProfile.photos*.save()
                                    address?.save()
                                    userProfile?.save()
                                    userSecurity.password = userSecurity.password.encodeAsPassword()
                                    userSecurity.confirmPassword = userSecurity.confirmPassword.encodeAsPassword()
                                    userSecurity?.save()
                            }
                            flash.message = 'No Errors Registering User'
                            render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
                    }
        

        因为 && 以第一个 False 结果失败,并且其他验证方法没有被执行。

        所以把它们改成这个

        if ( ! (userSecurity.validate() & userProfile.validate() & address.validate() & photo.validate() ) ){
                            flash.message = ' Error registering user '
                            render(view:'index',model:[security:userSecurity,user:userProfile,address:address,photo:photo])
                    }else{            ...              }
        

        每个 bean 都经过验证,所有字段错误都会正确呈现。

        【讨论】:

          猜你喜欢
          • 2011-02-12
          • 2017-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多