如何更新Grails中现有的JSON对象参数?

时间:2015-05-27 13:50:26

标签: json angularjs grails

我正在做一个待办事项清单。首次输入项目并将其添加到列表时,服务器运行良好。它接受用户选择的参数并将它们传递到服务器上的列表中,该列表可以通过呈现Item.list()来查看,如下所示:

[{"class":"server.Item","id":1,"assignedTo":"User 1","comments":null,"completed":false,"creator":"User 1","name":"Task 1","priority":"1","type":"Personal"},
{"class":"server.Item","id":2,"assignedTo":"User 2","comments":null,"completed":false,"creator":"User 2","name":"Er","priority":"3","type":"Work"},
{"class":"server.Item","id":3,"assignedTo":"User 1","comments":null,"completed":false,"creator":"User 2","name":"Ga","priority":"1","type":"Work"}]

现在,用户可以选择稍后编辑任务。在客户端这可以正常工作,但我需要用户能够保存新的,更新的任务。

这是我目前的更新功能:

def updateList() {
    def newItem = Item.findById(request.JSON.id)

    newItem.assignedTo = request.JSON.assignedTo
    newItem.comments = request.JSON.comments
    newItem.completed = request.JSON.completed
    newItem.creator = request.JSON.creator
    newItem.name = request.JSON.name
    newItem.priority = request.JSON.priority
    newItem.type = request.JSON.type
    newItem.save(flush: true)
    render newItem as JSON
}
但是,这并不起作用。我得到一个空指针异常,表示"无法设置属性" assignedTo"在null对象上。我假设findById请求没有为JSON对象获取任何内容,因此没有对象分配值,但是我不知道问题是什么,因为项目实际上是放在进入Item.list()。

在客户端使用以下JS函数调用它:

$scope.updateList = function() {
    angular.forEach($scope.items, function (item) {
       // serverList.save({command: 'updateList'}, item);
        $http.post('http://localhost:8080/server/todoList/updateList', item)
            .success(function(response) {})
            .error(function(response) {alert("Failed to update");});
    });
};

2 个答案:

答案 0 :(得分:0)

这可能取决于您的Grails版本,但您应该可以这样做:

def update(Item item) {
  if (!item) {
    // return a 404
  } else {
    // you should really use a service and not save
    // in the controller
    itemService.update(item)
    respond item
  }
}

Grails非常聪明,因为JSON参数中有ID,所以可以查看该项目,并正确填充对象。

答案 1 :(得分:0)

对于可能需要以基本方式执行此操作的任何其他人的解决方法,我所做的工作是清楚单击“更新列表”时的列表,然后回读当前的值在客户端列表中。

的Grails:

def clearList() {
    Item.executeUpdate('delete from Item')
    render Item.list()
}

def updateList() {
    def newItem = new Item(request.JSON)
    newItem.save(flush:true)
    render newItem as JSON
}

使用Javascript:

$scope.updateList = function() {    // Update list on the server
    serverList.get({command: 'clearList'});
    angular.forEach($scope.items, function (item) {
        serverList.save({command: 'updateList'}, item);
    });
};