繁体   English   中英

<g:remoteFunction>在grails中

[英]<g:remoteFunction> in grails

我有这个jQuery代码:

 $(".inputFiles").on("change", function(e) {
    var uploadedFiles = e.originalEvent.target.files;
    var fileSize = 100;
    var fileType = ["image/jpeg", "image/pjpeg"];

    alert("length" + uploadedFiles.length)
    for (var i = 0,len = uploadedFiles.length; i < len; i++) {
        var n = uploadedFiles[i].name;
        var s = uploadedFiles[i].size; 
        var t = uploadedFiles[i].type;


                    }
 <g:remoteFunction action="testAjax" params="[files:uploadedFiles]" />
     });

   });

这是控制器中的动作:

def testAjax() {
    println ("ajax data "+params)
    }

我总是将params.files null,尽管alert("length" + uploadedFiles.length) params.files alert("length" + uploadedFiles.length)显示的是已上传文件的数量,并且我也想更新<p id="msgs"/> ,以防成功或失败。

我也厌倦了下面的<g:remoteFunction action="testAjax" params="[files:uploadedFiles]" /> ,但是它没有达到testAjax的动作,我该如何解决

$.ajax({ 
        url:'/myApp/photos/testAjax',
        type:'POST' ,
        dataType: 'JSON', 
        data: {files: uploadedFiles}, 
        success: function(data) {
        alert ("all files uploaded" + data);
            },

        error: function(data,textStatus) {alert("something went wrong " + textStatus);},
        complete : function (){
        alert("all done fine");
            }

        });

在您的示例中,数据输出将类似于:

data: {'files':'uploadedFiles'}

因为:

if(attrs?.params instanceof Map) {
                    hasParams = true
                    out << attrs.remove('params').collect { k, v ->
                        "\'" +
                                "${k}".encodeAsJavaScript() +
                                "\': \'" +
                                "${v}".encodeAsJavaScript() +
                                "\'"
                    }.join(",")
                }

这是来自remoteFunction taglib的代码的一部分。 最好的方法是编写自己的Ajax代码:如果发送文件,它将被发布,因此:

$.post("${createLink(action: 'testAjax', absolute:true)}", {files:uploadedFiles})

我认为它更容易,更干净。 希望对您有所帮助。

我想您正在使用JQuery作为javascript库。 那你可以试试看

<g:remoteFunction action="testAjax" params="'files':uploadedFiles" />

如果您使用的是Dojo,则可以尝试以下操作:

<g:remoteFunction action="testAjax" params="'files'=uploadedFiles" />

潜在的技巧是阅读浏览器开发人员工具中的源代码,以了解Grails对javascript的翻译是对还是错; 然后根据翻译后的javascript调整代码。

uploadedFiles在你的代码转换为null ,因为Grails的对待paramsg:remoteFuntion不带引号的常规地图。 所以uploadedFiles在你的代码被视为常规变量,而不是在这种情况下,一个JavaScript变量。

另一种选择是直接使用jquery而不是g:remoteFunction 我个人尝试避免使用此标记,因为这样,JavaScript就会进入gsp而不是js文件。 维护不太好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM