【问题标题】:Angular ng-repeat with constant & RestangularAngular ng-repeat 常量和 Restangular
【发布时间】:2014-07-16 16:46:48
【问题描述】:

我正在使用一个奇怪的数据模型(目前无法绕过它)。我正在使用 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 只会根据该常量对象进行填充(即:它会检查那些字符串“resource1、resource2 等" 如果它在那里,那么它将填充模板。但我不确定如何执行此操作。

还有其他选项还是我没有使用 ng-repeat 功能?任何帮助谢谢

【问题讨论】:

    标签: angularjs constants ng-repeat restangular


    【解决方案1】:

    这是我将使用的example。我相信最初你的传入数据看起来像这样......

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

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

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

    或者您可以为对象“类型”添加一个公共字段

    $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' }
    ];
    

    在检索数据时进行标准化可能是您最好的选择。那么问题就变成了您是否需要保留对象类型信息。

    【讨论】:

    • 有趣的方法,我喜欢。你的问题的答案是我没有。我只需要保留资源键值对。资源 id 在 restangular 响应中,所以如果我需要做任何 POST,我可以从那里抓取它。您认为您可以为我指出如何在我的控制器中对其进行标准化的正确方向吗?在我试图从中显示信息的单个资源对象中,我有大约 15 个不同的键值对和不同的信息。
    • 您可以使用Object.keys 查看给定对象的所有属性。从那里开始,确定要保留哪些属性以及如何以最通用的方式提取这些属性以最大程度地减少您进行的测试和调用的数量。
    • 对,只是变成了一个繁琐的项目。理想情况下,我会想办法在视图中完成所有这些操作以获取正确的信息。我会更深入地研究,看看我如何能够在我的控制器中正常化它,即使我想避免它。
    • 视图是用来显示数据的,你应该很少做数据操作。理想情况下,您已经收到了正确格式的数据,因为这不是一个选项,您可能应该在检索时对数据进行规范化,以确保整个应用程序的一致性。
    【解决方案2】:

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

    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!

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多