Javascript中g:message的动态使用

Javascript中g:message的动态使用,javascript,grails,Javascript,Grails,是否有一种简单的方法可以在Javascript中以动态方式使用g:message功能,例如 function get_i18n( myAttr ) { return "${message(code:'" + myAttr + "')} "; } 这样我就可以执行函数调用了 pl_get_i18n( "xyz" ) 对于预定义的i18属性xzy 就像这里,但充满活力: 注:JS代码包含在GSP文件中。简短的回答是“否”。GSP标记只能在服务器端执行,不能通过浏览器(即JavaScri

是否有一种简单的方法可以在Javascript中以动态方式使用g:message功能,例如

function get_i18n( myAttr ) {

   return "${message(code:'" + myAttr + "')} ";

}
这样我就可以执行函数调用了

pl_get_i18n( "xyz" )
对于预定义的i18属性xzy

就像这里,但充满活力:

注:JS代码包含在GSP文件中。

简短的回答是“否”。GSP标记只能在服务器端执行,不能通过浏览器(即JavaScript)执行

但是,我希望至少有一个Grails插件可以执行以下操作:

  • 创建包含
    messages*.properties
    文件中定义的消息的JavaScript对象
  • 提供一个JavaScript函数,使您能够解析来自此对象的消息
因此,尽管无法在浏览器中执行GSP标记,但在JavaScript中提供等效功能似乎并不十分困难。如果还没有一个Grails插件可以做到这一点,我会感到惊讶。

简短的回答是“不”。GSP标记只能在服务器端执行,不能通过浏览器(即JavaScript)执行

但是,我希望至少有一个Grails插件可以执行以下操作:

  • 创建包含
    messages*.properties
    文件中定义的消息的JavaScript对象
  • 提供一个JavaScript函数,使您能够解析来自此对象的消息

因此,尽管无法在浏览器中执行GSP标记,但在JavaScript中提供等效功能似乎并不十分困难。如果还没有一个Grails插件可以做到这一点,我会感到惊讶。

下面是一个非常简单的示例,说明如何使用AJAX从服务器获取消息代码

// AjaxMessageController.groovy
package example

import grails.converters.JSON

class AjaxMessageController {
    def index() {
        render [message: message(code: param.code)] as JSON
    }
}
在本例中,您可以在页面中使用ajax调用(基于jQuery)来查找消息代码:

var someMessageCode = 'something.you.want';
$.ajax({
    dataType: 'json',
    url: '${createLinK(controller: "ajaxMessage", action: "index"}',
    data: {code: someMessageCode},
    success: function(data) {
        window.alert(data.message);
    }
});

下面是一个非常简单的示例,说明如何使用AJAX从服务器获取消息代码

// AjaxMessageController.groovy
package example

import grails.converters.JSON

class AjaxMessageController {
    def index() {
        render [message: message(code: param.code)] as JSON
    }
}
在本例中,您可以在页面中使用ajax调用(基于jQuery)来查找消息代码:

var someMessageCode = 'something.you.want';
$.ajax({
    dataType: 'json',
    url: '${createLinK(controller: "ajaxMessage", action: "index"}',
    data: {code: someMessageCode},
    success: function(data) {
        window.alert(data.message);
    }
});

调用Javascript时,Javascript在客户端浏览器中执行,当服务器呈现页面时,GSP/标记库在客户端浏览器中执行。你不能以这种方式把两者混为一谈。当javascript执行时,服务器已经呈现页面并处理了
消息
标记。为了做到这一点,您需要制作一个控制器,该控制器将消息代码作为参数并返回值,通过ajax从javascript访问该值。javascript在调用时在客户端浏览器中执行,其中GSP/标记库在服务器呈现页面时执行。你不能以这种方式把两者混为一谈。当javascript执行时,服务器已经呈现页面并处理了
消息
标记。为了做到这一点,您需要制作一个控制器,该控制器将消息代码作为参数并返回值,通过ajax从您的javascript访问该值。有点像这样:JAWR曾经做过类似的事情,但最近有人说它似乎被放弃了。但是一次写入所有字符串是有效的,如果配置caching@BurtBeckwith我在JAWR插件的源代码/文档中看不到任何提示它这样做的内容,但您可能是对的。无论如何,JAWR插件似乎与资源或资产管道插件都不兼容,因此可能对大多数Grails 2.X应用程序没有多大用处。它可能不是插件的一部分,也可能被删除,但很可能只是插件文档中的一个遗漏。这里是为JAWR库描述的:有点像这样:JAWR曾经做过类似的事情,但最近有人说它似乎被放弃了。但是一次写入所有字符串是有效的,如果配置caching@BurtBeckwith我在JAWR插件的源代码/文档中看不到任何提示它这样做的内容,但您可能是对的。无论如何,JAWR插件似乎与资源或资产管道插件都不兼容,因此可能对大多数Grails 2.X应用程序没有多大用处。它可能不是插件的一部分,也可能被删除,但很可能只是插件文档中的一个遗漏。这里对JAWR库进行了描述:我知道您并没有声称这段代码是生产级代码,只是为了以防万一:从性能角度来看,使用单独的AJAX请求检索每条消息是一个非常糟糕的主意。所有消息都应在单个请求中下载,并由浏览器缓存。此外,上面的实现不允许将值替换为带有参数的消息。这取决于。如果您只有很少使用的消息代码的一小部分,那么这实际上可能是最好的生产准备方法。然而,我完全同意,对于任何名义上使用消息代码的站点来说,这是一种可怕的方法。感谢您专门为本答案的未来观众指出这一点。(投票支持您的答案,现在也支持您的评论)我知道您并没有声称此代码是生产级代码,但以防有人不这么认为:从性能角度来看,使用单独的AJAX请求检索每条消息是一个非常糟糕的主意。所有消息都应在单个请求中下载,并由浏览器缓存。此外,上面的实现不允许将值替换为带有参数的消息。这取决于。如果您只有很少使用的消息代码的一小部分,那么这实际上可能是最好的生产准备方法。然而,我完全同意,对于任何名义上使用消息代码的站点来说,这是一种可怕的方法。感谢您专门为本答案的未来观众指出这一点。(投票支持你的答案,现在也支持你的评论)