Grails 3和angular - 如何将输入参数传递给后端控制器

时间:2016-05-06 12:58:15

标签: angularjs grails

我对这个问题提前感到抱歉,但我不知道该怎么办。我最近开始使用AngularJS和Grails 3,我对整个数据流感到有些困惑。我正在寻找一个明确的解释,但我没有找到适合我的问题的任何好的来源。

我们有一些数据模型,将它们命名为Foo,它们与其他对象有关系,将它们命名为Bar:

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 所需的信息,但我无法在后端访问它,因为后端的save方法是使用数据类型 Foo 调用的因此,在Foo中,Bar为空。

到目前为止,我有一个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还不够了解,但这对于本周末来说非常重要,我绝对需要任何帮助。 : - (

提前非常感谢!

1 个答案:

答案 0 :(得分:0)

在最终找到解决方案之后,我忘了编辑我的答案。

我混淆的原因是我对格拉斯如何运作缺乏了解。我的背景是更好的NodeJS和一些Java经验。我只是习惯使用一个请求对象封装POST请求的请求参数。

在NodeJS中,我通过函数调用中的参数(函数(req,res,next),res封装http数据)接收请求参数。

grails中的问题是,即使在我的后端控制器中的任何地方都没有定义过这个数据,这个数据已经可以访问了:请求和参数对象!

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

我只需要在后端控制器中添加以下代码:

params.putAll(request.JSON as Map)

并删除我的save方法的输入参数,该参数导致:

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

   log.println(params)
}

当有另一个背景时,在grails中发生的魔法可能非常混乱,特别是如果你没有时间通过​​一些教程习惯它。

干杯,

Vegaaaa