8

使用restangular处理嵌套资源时的最佳实践是什么?IE

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.comments)。

project.name = 'New Name!';
project.put();

这让我觉得我一定是在执行一些错误的事情,并且有更好的方法来处理它吗?

没有像这样(未经测试)将所有内容直接定义为单个 $scope ?IE

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;

});

建议的最佳做法是什么?

4

2 回答 2

1

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

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

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

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

您可以创建一个自定义方法,从对象中删除“证明”属性,或者仅选择某些字段以 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()项目对象时,其中将不再具有嵌套资源。您可以在此处阅读有关 delete 关键字的更多信息。

您可以在控制台打印出该对象,以准确查看您向服务器提供的内容:

console.log(project);
于 2014-07-31T02:05:03.393 回答
0

如果只修改一个字段,你可以使用element.patch一个参数,像这样:

// 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" /> 
于 2015-04-22T14:23:26.433 回答