角度ng-repeat与常数& Restangular

时间:2014-07-16 16:46:49

标签: angularjs constants ng-repeat restangular

我正在处理一个奇怪的数据模型(此时无处可去)。我使用restangular进行休息调用以获取单个资源对象

通常,restangular返回的资源对象就是我设置的内容 $ scope.resource =响应,我可以在视图/模板中执行resource.name,resource.id等。

除了这组资源而不是返回响应对象中的键值对,它返回一个对象内的对象,如此

resource1: {name: 'value', stuff: 'value', etc}

这很好,因为我只需要在我的控制器中设置$ scope.resource = response.resource1

除了问题是,是否存在5种不同类型的资源对象名称,因此如果我通过id调用创建资源,我可能会返回resource2,resource4,resource1等,因此设置我的$ scope.resource = response.resource1仅在我获得resource1时才有效。

我第一次尝试解决这个问题就是只使用我设置的ng-repeat

<ul ng-repeat="(resource, value) in resource">
        <li class="list-group-item">
            Name:
            <span class="pull-right"> {{ resource.name }} </span>
        </li>
</ul>

效果很好,因为restangular返回所有这些额外的东西,它循环遍历每个对象,如果有意义,它会重复一堆空白的HTML内容。

我的另一个想法是尝试制作一个常量并制作一个拥有全部5个资源的对象,我的ng-repeat只会根据该常量对象填充(即:它会检查那些字符串&#34; resource1, resource2等等#34;如果有,那么它将填充模板。但我不确定如何做到这一点。

任何其他选项或是否有重复功能我只是没有使用?任何帮助谢谢

2 个答案:

答案 0 :(得分:1)

这是我将要工作的example。最初你的传入数据看起来像我相信......

 $scope.data = [
 {
   resource1 : { name: 'r1' }
 },
 {
   resource2 : { name: 'r2' }
 },
 {
   resource2 : { name: 'r2' }
 }];

当您收到数据时,您可以通过将其展平为以下结构来对其进行标准化...

$scope.normalized = [
  { name : 'r1' },
  { name : 'r2' },
  { name : 'r2' }
];

或者您可以为对象“type”添加公共字段

$scope.expanded = [
  {
    type : 'resource1',
    resource1 : { name: 'r1' }
  },
  {
    type : 'resource2',
    resource2 : { name: 'r2' }
  },
  {
    type : 'resource2',
    resource2 : { name: 'r2' }
  }];

或者您可以规范化但保留类型数据......

$scope.normalizedType = [
  { type : 'resource1', name : 'r1' },
  { type : 'resource2', name : 'r2' },
  { type : 'resource2', name : 'r2' }
];

在检索数据时进行规范化可能是您最好的选择。那么问题就是你需要保留对象类型信息。

答案 1 :(得分:0)

我提出的另一个解决方案是将所有资源键名称放入列表

resources = ['resource1', 'resource2', 'resource3', 'etc..']

在我的restangular服务承诺中,我刚刚检查了像这样的for循环的资源编号

return ResourceRestangular.all('resource').get(resourceId).then(function(response){
        for (i = 0; i < resources.length ; i++){
            if (resources[i] in response){
               self.resource = response[resources[i]];
            }
        }
            return self.resource;

不再需要ng-repeat!