2014-06-13 57 views
0

因此,我是一位新手grails開發人員,他想知道如何正確使用每個MVCS設計模式的服務。現在在我的服務中,我有幾個功能在執行我的應用程序邏輯,然後我直接從我的gsp引用服務。我讀了here的評論,這是不好的形式。所以現在我有在Grails中正確使用服務(每個MVCS)

<g:set var="doc" bean="documentPartService"/>直接在我的gsp。

所以我想通過傳遞信息通過正確的渠道來改變它,就像評論狀態一樣。

我遇到的一個小障礙是從我的服務傳遞信息到我的控制器到我的gsp。對於我的控制器

def replace(){ 
    render documentPartService.replace(params) 
} 

爲例

<g:form name="inputForm" action="replace"> 
somecodehere... 
<input value="Submit" type="submit"> 
</g:form> 

然後在我的替代功能,那麼我有我的一些服務邏輯。

我在一些服務我已經看了都看到了,他們返回該變量作爲JSON(documentBody是一個局部變量我的服務)

return documentBody as JSON

,但我對如何有點疑惑實際上在我的控制器/視圖中訪問這個。我不能在我的控制器中使用 print documentBody,因爲它只在我的服務中定義。在我用作參考的插件服務和控制器中,控制器是1個內襯,就像我擁有的​​那樣,他們所做的唯一的事情就是render servicefunction()

任何人都可以闡明我應該如何正確設計它?

回答

1

當您發佈表單時,動作是替換 - 控制器中的替換動作將服務的輸出呈現爲輸出,而不是返回gsp綁定到替換控制器定義。

理論上它應該像在用戶將會發布一樣 - 該帖子將返回動作替換,它將返回該JSON響應。

另一種方法是

def replace(){ 
    def myValue=documentPartService.replace(params) 
    render (view: 'replace', model: [myValue:myValue ]) 
} 

,那麼你可以有一個名爲取代它有$ {} myvalue的在其中定義,這將是它的結果的GSP頁面。

而且它可能是一個更好的主意來調用通過控制器通過定義值您服務吧:

def replace(String val1,String val2,String val3){ 
    def myValue=documentPartService.replace(val1,val2,val3) 
    [myValue:myValue ] 
} 

UPDATE

它可能看起來多來,從我在暗示後者方法考慮你可能看到的第一個電話,即

render documentPartService.replace(params) 

調用類似於上述方法插件..我想如果你看看郵件列表插件,你會發現在Burt的幫助下。控制器/服務被鎖定到數據類型和確切的期望值。

我只能從經驗告訴你,最佳實踐是,如果他們是定義的函數,沒有理由進行擴展,然後堅持後一種方法。在例如使用渲染服務輸出方法的ajaxdependancyselection的情況下,在某些方面,這有助於保持其更向後/向前兼容。但實際上想想這些電話可能會被鎖定。將很快更新插件

+0

謝謝,這是有幫助的。我的問題是認爲控制器總是呈現綁定到控制器定義的gsp,因爲如果控制器操作沒有正文,那麼這是本機行爲,現在我知道這是不正確的 –

+0

如果您沒有定義呈現標記,那麼它會假設有一個gsp,如果你渲染「東西」,那麼它會顯示,或者你可以定義渲染(視圖:'someotherview')或渲染(模板:'a_template')。您只需要定義渲染視圖:如果視圖將與控制器操作不同 – Vahid

相關問題