2016-05-06 49 views
1

我很抱歉提出這個問題,但我不知道該怎麼做了。我最近開始使用AngularJS和Grails 3,我對整體數據流感到困惑。自從幾天以來,我正在尋找一個明確的解釋,但是我沒有提出任何適合我的問題的良好來源。Grails 3和角度 - 如何將輸入參數傳遞到後端控制器

我們有一些數據模型,它們命名爲富,其中有一個相對於其他的對象,他們的名字吧:

class Foo implements Serializable{ 
    Date dateCreated 
    Date lastUpdated 

    String name 
    Bar bar 
    C c 
    ... 
} 

class Bar implements Serializable { 

    String name 
    String usid 

    C c 
    D d 
    E e 
} 

現在我想有一個輸入對話我可以填寫Object Foo所需的數據,以便在數據庫中使用一個http請求保存級聯所有對象。

我現在的問題是,因爲我是angularJS的新手,我不知道如何創建關係對象並在數據對象Foo中使用它們。我需要在我的JSON中創建對象Bar所需的信息,但我無法在後端訪問它,因爲後端的保存方法使用數據類型Foo進行調用,因此Bar在Foo中爲null。

到目前爲止,我有一個Foo的前端控制器,並且在請求後,Foo.controller注入一個帶有動作的Foo.service:'save',以便在後端以某種方式調用方法保存。

這裏是重要的部分代碼:

前端控制器:

function FooCreateController(fooService, $routeParams, $location) { 
    var vm = this; 
    vm.save = function (foo) { 
     fooService.save({action: 'save'}, foo, function (res) { 
      if (res.id) { 
       $location.path("/foo/" + res.id); 
      } 
      else { 
       alert("Unknown error occurred"); 
      } 
     }) 
    } 
} 

fooDataFactoryService:

angular 
    .module("fooPackage.foo") 
    .factory("fooDataFactoryService", fooDataFactoryService); 

function fooDataFactoryService(DomainServiceFactory) { 
    return DomainServiceFactory('/foo/:action/:fooId', {fooId: '@id', action: '@action'}, 
     {"show" : {method: "GET"}}, 
     {"save" : {method: "POST"}}, 
     {"delete" : {method: "DELETE"}}, 
     {"update" : {method: "PUT"}} 
    ); 
} 

Groovy的後端控制器:

def save(Foo foo) { 
    if (foo == null) { 
     transactionStatus.setRollbackOnly() 
     render status: NOT_FOUND 
     return 
    } 

    if (foo.hasErrors()) { 
     transactionStatus.setRollbackOnly() 
     respond foo.errors, view:'create' 
     return 
    } 

    foo.save flush:true 

    respond foo, [status: CREATED, view:"show"] 
} 

如何我可以做到這一點嗎?我不想用數據類型Foo調用後端保存方法,但是使用來自請求的輸入參數。或者有沒有更好的方法呢?

我對Angular還不夠了解,但是這個週末完成非常重要,我肯定需要任何幫助。 :-(

非常感謝事先!

+0

好了,所以我現在的想法是不使用對象美孚在此對話框中,而是使用類似的對話對象,它需要所有的輸入參數爲字符串,並將它們傳遞到後端控制器。然後控制器根據他得到的參數來實例化新的對象。這應該工作,但它似乎並不適合我...另一個想法,高度讚賞! – Vegaaaa

+0

我收回來了,對這個解決方案的看法越多,對我而言就越好。通過使用一個自己的公式對象來處理這個輸入請求,我們也可以獲得更高的關注點和更高的模塊性...... – Vegaaaa

回答

0

我忘了後,終於搞清楚這個解決方案來編輯​​我的答案。

原因我的困惑是缺少知識,我對如何的Grails工程。我的背景是更大的NodeJS和一些Java的經驗。我只是使用一個請求對象封裝POST請求的請求參數在它的正文。

在NodeJS中,我通過參數接收請求參數在函數調用中(函數(req,res,next),res封裝http數據)

在grails中的問題是,即使它在我的後端控制器中從未定義過任何位置,該數據已經可以訪問:請求和params對象!

http://docs.grails.org/3.1.1/ref/Controllers/params.html

我只需要添加以下代碼在我的後端控制器:

params.putAll(request.JSON as Map) 

,並刪除我的保存方法的輸入參數,從而導致:

def save() { 
    params.putAll(request.JSON as Map) 

    log.println(params) 
} 

發生在Grails中的魔法可能會讓你感到困惑,尤其是當你沒有時間通過​​一些教程習慣它時。

乾杯,

Vegaaaa

相關問題