我目前正忙着使用restangular和ui-router。
我确实在路由器中解析了一系列项目,使其可供底层控制器使用。我有一个待办事项列表,我想编辑待办事项。所以我加载了一个可以编辑项目的视图。
我通过$scope.todo = todos.get(id)
获取模型我对其进行了更改,然后我执行$scope.todo.save()
更新服务器上的模型。但是现在我的旧物品仍然存放在待办事项中。
我希望我的收藏能够反映单个项目的变化。我可以从集合中删除该项目,然后重新插入它,但这看起来有点太复杂了。有没有简单的方法来更新集合中的模型?
更新:添加一些代码
注意:如果调用状态,则会解析todos属性。
如果我编辑单个待办事项,我将通过
解决resolve : {
todo : function($stateParams, todos) {
return todos.get($stateParams.id);
}
}
我做了一些更改,然后拨打todo.save()
。此方式不会对集合进行任何更改。我试图做一个todos.patch(todo)
,但实际上是对奇怪的网址提出了请求,我想这是打算修补整个集合(?)
我确信有一种方法可以更改集合中的模型,但我不知道如何
答案 0 :(得分:1)
在尝试了一些东西后,我最终更换了集合中的项目。我为lodash创建了一个小帮手,我想在这里展示:
var replaceItemById = function(list, element) {
var index = _.indexOf(list, _.find(list, { id : element.id }));
list.splice(index, 1 , element);
return list;
};
_.mixin({'replaceItemById' : replaceItemById});
当我想要更新集合中的模型时,我会一步一步地进行:
获取集合 从集合中获取单个项目并进行编辑 在项目上调用保存
//The server returns the updated model
todo.save().then(function(editedTodo) {
_.replaceItemById(todos, editedTodo);
$state.go('todos.index');
});
这样我就不需要再次获取集合(即使在大多数情况下这是你要做的),并且在更新单个项目后它是最新的。