2010-07-02 24 views
1

我想使用remoteLink(使用Prototype作爲Javascript庫)進行Ajax調用,但我需要傳遞的參數之一是來自文本字段的值。以下是我目前在我的GSP中所擁有的內容:在Grails中使用remoteLink的動態參數

<input id="email" name="email" type="text"/> 
... 
<g:remoteLink action="addEmail" params="[email:???]">Add</g:remoteLink> 

我該如何放置?讓remoteLink發送電子郵件文本字段的值作爲參數?基本上,我如何在Grails標籤中引用/訪問DOM?

我試圖把

\$('email').value 

代替???但在我的GSP中出現了「無法解析腳本」錯誤。

感謝

回答

5

我已經需要做之前相似,對我下面的工作(是的,不是特別優雅)做了什麼:提取爲了清晰的JavaScript函數

<input id="email" name="email" type="text"/> 
... 
<g:javascript> 
    var addEmail = function() 
    { 
     ${ remoteFunction (action:"addEmail", update:"update-element-id", params:" 'email=' +$('email').value ") } 
    }; 
</g:javascript> 
<a href="javascript:void(0)" onclick="addEmail();return false;">add email</a> 

,並添加PARAMS裏面的一些空間以顯示單引號更清晰。

+0

這比我概述的方式更好;它允許你在不破壞實現的情況下從Prototype切換到其他東西。好建議,upvoted。 – proflux 2010-07-05 15:43:47

+0

如果您將 var emailVal = $('email')。value; 這個函數裏面的這個函數真的很好。你能否在你的答案中做出改變,我會接受。謝謝。 – 2010-07-05 19:35:07

+0

完成。 THX爲up proflux,希望有一個更優雅的方式來讓gsp和javascript進行交互,猜測它與服務器和其他客戶端之間的困難...... – Chris 2010-07-06 11:34:24

3

<g:remoteLink action="addEmail" params="${[email: some.groovy.to.get.your.email()]}">Add</g:remoteLink>

+1

此代碼錯誤,您不能擁有「some.groovy.to.get.your.email」,因爲該代碼在顯示頁面和輸入電子郵件字段之前呈現在服務器上。您需要js代碼在電子郵件字段填充後在客戶端上執行。 – Eduard 2013-06-21 13:36:55

0

如果你還好用一個按鈕,而不是鏈接此使用G變得微不足道的:submitToRemote。但是,如果它是一個鏈接,你可以做一些醜陋這樣的:

的意見/郵件/ index.gsp中:

<%@ page contentType="text/html;charset=UTF-8" %> 

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Sample title</title> 
    <g:javascript library="prototype" /> 
    </head> 
    <body> 
    <g:form name="theForm"> 
    Email: <g:textField name="emailAddr" /> 
    <!-- Here comes the ugly --> 
    <a href="#" name="submit" 
     onclick="new Ajax.Updater('resp','${createLink(action:'addEmail')}',{asynchronous:true,evalScripts:true,parameters:Form.serialize(document.theForm)});return false"> 
    Submit Form 
    </a> 
    </g:form> 
    <div id="resp"> 
    </div> 
    </body> 
</html> 

電子郵件控制器:

class EmailController { 

    def index = { } 

    def addEmail = { 

     if(params?.emailAddr) { 
      render "${params.emailAddr}" 
     } 
     else { 
      render "No Email Entered" 
     } 
    } 
} 

夫婦注意事項如果你自定義: * Ajax.updater的第一個'resp'參數是你想要在Form.serialize(document.theForm)命令中更新 *的div的id,'theForm'需要以符合您分配表單的名稱。

1

有一個更好的解決方案。

在remoteLink標籤的屬性之前使用來設置一個包含你的DOM事物的js變量。

例如: 在JS:

var MyJSClass = { 
    setParams: function() { 
    MyJSClass.dynamicParams = {email: $("#email").val(), myOtherField: anyJSLogicHere()} 
    } 
} 
在GSP

<g:remoteLink action="addEmail" params="MyJSClass.dynamicParams" before="MyJSClass.setParams()">Add</g:remoteLink> 

看到的代碼,其是所述請求之前執行的js函數並設置dynamicParams屬性,該屬性將前然後在AJAX請求中使用。

0

根據Eduard的回答,我扣除了params屬性中的Javascript代碼將被執行。所以我嘗試了以下方法,它的工作原理如下:

<g:remoteLink action="addEmail" params="{email:\$('#email').val()}">Add</g:remoteLink> 
-1

如果您想使用帶有JQuery的remoteLink,以下是對我有用的東西。

<g:remoteLink action="${myBean.action}" params="[myParam: myBean.param]" update="updateDiv"> 
     My Awesome Link 
</g:remoteLink> 

簡單而整齊。

+0

這是如何解決問題,以增加參數值的文本字段是由用戶在頁面呈現後插入? – Eduard 2013-06-21 13:37:50

+0

如果我理解正確,您正在尋找使用用戶輸入的參數(字段)。你可以使用來解決這個問題。我有同樣的問題,submitToRemote實際上提交整個表單,所以你可以添加一個小表單,然後鏈接/按鈕可以提交它。 <克:形式行動= 「節目」> 登錄:<輸入名稱= 「登錄」 類型= 「文本」/> <克:submitToRemote更新= 「updateMe」/> HTTP://的grails .org/doc/latest/ref/Tags/submitToRemote.html – Abhay 2013-06-22 20:29:12

+0

還有一種情況是,您已經有一個表單和一個提交按鈕,但也需要傳遞一些參數的遠程鏈接 – Eduard 2013-06-28 10:43:00