微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 将实数值绑定到Grails域属性(Dojo小部件发送的值)

我正在使用带有Grails 2.3.9的Dojo 1.9.

Dojo NumberTextBox小部件 – 我在表单中使用 – 将固定格式(JavaScript基本格式)的实数值(例如:12.56)设置为HTML表单输入字段(但根据浏览器区域设置显示/编辑它们,所以用户总是看到格式正确的数字).

另一方面,Grails期望输入字段根据浏览器区域设置进行格式化.

这会导致转换不匹配,并且当浏览器区域设置不是英语时Grails会丢失小数位并将记录错误地保存到数据库中.

我试图通过实现自定义ValueConverter并在应用程序上下文中注册它来覆盖Grails中的值转换.

浏览器发送的请求正确包含实际值(“12.45”)

主要问题是我的转换器似乎根本没用过.

如何注册它以覆盖defaut Double数据转换?

转换器:

package gefc.dojo.binding

import org.grails.databinding.converters.ValueConverter
import java.text.NumberFormat

/**
 * Converter which allows that the doubles arrive 
 */
class DojodoubleValueConverter implements ValueConverter {

  NumberFormat fmt

  DojodoubleValueConverter() {
    // The number format sent by Dojo components
    // English locale for the decimal separator
    fmt = NumberFormat.getInstance(Locale.ENGLISH);
    // no grouping
    fmt.setGroupingUsed(false);
  }

  boolean canConvert(value) { value instanceof String }

  def convert(value) {
    Number n = fmt.parse(value)
    return n.doubleValue()
  }

  Class<?> gettargettype() {
    return Double.class
  }
}

我在应用程序上下文中注册(resources.groovy)

beans = {
  // Dojo components send real values in a fixed, ISO format, while Grails
  // expects them to be formatted according to client/browser locale
  // So we need to override real value conversions
  doubleConverter gefc.dojo.binding.DojodoubleValueConverter
}

解决方法:

此问题已在Grails 2.4中修复

我使用Grails 2.3.8与Long和Integer转换器有类似的问题. Grails正在使用LocaleAwareNumberConverter,它将“123abc”之类的字符串转换为“123”.
所以我定义了自己的转换器并覆盖了resources.groovy中的bean定义

beans = {
    "defaultGrailsjava.lang.LongConverter"(LongValueConverter)
    "defaultGrailsjava.lang.IntegerConverter"(IntegerValueConverter) 
}

class LongValueConverter implements ValueConverter {


    public LongValueConverter() {
    }

    boolean canConvert(value) {
        value instanceof String
    }

    def convert(value) {
        return value?.toLong()
    }

    Class<?> gettargettype() {
        return Long.class
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐