使用restangular处理嵌套资源时的最佳做法是什么? 即。
Restangular.one("accounts", 1).one("projects", 1).get().then(function (project) {
project.getList("proofs").then(function(proofs){
project.proofs = proofs;
_.each(proofs, function(proof){
proof.comments = proof.getList("comments");
});
});
$scope.project = project;
});
这样我就可以很好地访问视图中的每个内容。
<li ng-repeat="proof in project.proofs">Total: {{proof.comments.length}}</li>
如果我想对项目进行更新,那么它会将所有内容发送到项目REST端点(包括所有校样和所有proofs.com)。
project.name = 'New Name!';
project.put();
这让我觉得我必须实施一些错误的东西,并且有更好的方法可以解决这个问题吗?
没有用这样的东西(没有经过测试)将所有内容直接定义到单个$ scope? 即。
Restangular.one("accounts", 1).one("projects", 1).get().then(function (project) {
project.getList("proofs").then(function(proofs){
$scope.projectProofs = proofs;
_.each(proofs, function(proof){
$scope.proofComments[proof.id].push(proof.getList("comments"));
});
});
$scope.project = project;
});
建议的最佳做法是什么?
答案 0 :(得分:1)
有两种选择:编写自定义PUT方法或从对象中删除属性
放置元素的默认方法是提交 all 所设置的参数。
您可以在Restangular源代码中看到这一点,其中每个资源都使用一组默认方法进行初始化,这些方法接受所有参数,并且不执行任何过滤来删除参数。
您可以创建一个自定义方法,从对象中去除“proofs”属性,或者只在请求中选择某些字段进行PUT。
在您put()
项目之前,您可以执行以下操作:
/* ... code to get the project object and the nested proof objects ... */
project.name = 'New Name!';
delete project.proofs;
project.put();
delete关键字将从对象中删除该属性。然后,当您调用put()
时,项目对象将不再具有嵌套资源。 You can read more about the delete keyword here.
您可以在控制台上打印出对象,以确切了解您要向服务器添加的内容:
console.log(project);
答案 1 :(得分:0)
如果仅修改一个字段,则可以将element.patch
与param一起使用,如下所示:
// get project...
update = function(field, value){
project.patch({ field, value });
}
此外,大多数情况下,您的字段值已通过<input ng-model="project.FIELD_NAME"/>
更改,因此您可以重复使用它:
在您的控制器中:
// get project...
$scope.update = function(field){
payload = {};
payload[field] = $scope.project[field];
project.patch(payload);
}
在您的模板中
<!-- Use submit button or ng-blur... -->
<input ng-model="project.FIELD_NAME" />