Restangular - 嵌套资源

时间:2013-11-11 16:01:33

标签: angularjs rest restangular

使用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;

});

建议的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

有两种选择:编写自定义PUT方法或从对象中删除属性

选项#1:编写自定义PUT方法

放置元素的默认方法是提交 all 所设置的参数。

您可以在Restangular源代码中看到这一点,其中每个资源都使用一组默认方法进行初始化,这些方法接受所有参数,并且不执行任何过滤来删除参数。

您可以创建一个自定义方法,从对象中去除“proofs”属性,或者只在请求中选择某些字段进行PUT。

选项#2:从对象中删除属性。

在您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" />