[{"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");});
});
};
答案 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);
});
};