【问题标题】:Double ng-repeat to flatten out nested object双 ng-repeat 以展平嵌套对象
【发布时间】:2016-04-12 17:40:17
【问题描述】:

到目前为止,我已经用ng-repeat-start 解决了这个问题。目前看起来是这样的:

控制器

$scope.providers = [
  'Site Hosting',
  'Best Hosting',
  'Fantastic Hosting'
];

$scope.providerColumns = {
  price: {
    text: 'Price',
    exposed: true
  },
  site: {
    text: 'Website',
    exposed: true
  },
  phone: {
    text: 'Phone Number',
    exposed: false
  }
};

模板

<div class='table-header-row'>
  <div class='first-header-cell' ng-repeat='obj in firstCellsHeaders'>
    {{obj.text}}
  </div>
  <div class='middle-header-cell' ng-repeat-start='prov in providers' ng-if='providerColumns.price.exposed'>
    {{prov}} {{providerColumns.price.text}}
  </div>
  <div class='middle-header-cell' ng-if='providerColumns.site.exposed'>
    {{prov}} {{providerColumns.site.text}}
  </div>
  <div class='middle-header-cell' ng-repeat-end ng-if='providerColumns.phone.exposed'>
    {{prov}} {{providerColumns.phone.text}}
  </div>
  <div class='last-header-cell' ng-repeat='obj in lastCellsHeaders'>
    {{obj.text}}
  </div>
</div>
<div class='table-row'>
  <div class='first-cells' ng-repeat='obj in firstCells'>
    {{obj.text}}
  </div>
  <div class='middle-cells' ng-repeat-start='prov in providers' ng-if='providerColumns.price.exposed'>
    {{data[prov].price}}
  </div>
  <div class='middle-cells' ng-if='providerColumns.site.exposed'>
    {{data[prov].site}}
  </div>
  <div class='middle-cells' ng-repeat-end ng-if='providerColumns.phone.exposed'>
    {{data[prov].phone}}
  </div>
  <div class='last-cells' ng-repeat='obj in lastCells'>
    {{obj.texLine2}}
  </div>
</div>

它本质上是一个由 div 构建的表格,以便于在角度完成渲染后重新排序列。

现在我意识到ng-repeat-start 中表示的对象比我之前想象的更动态,我希望能够有一个 squared ng-repeat,即没有嵌套元素的嵌套重复,很像在tbody 元素上使用ng-repeat 的常用解决方案,然后在其中的tr 元素上使用额外的ng-repeat,这本质上是一种扁平的嵌套效果。我需要一个水平元素的解决方案,最好是divs。但是,我不能以任何方式将它们捆绑在一起,因此不能嵌套 divs 或类似的东西。理想情况下,它看起来像这样:

<div ng-repeat='prov in providers' ng-repeat='col in providerColumns' ng-if='col.exposed'>
  {{data[prov][col]}}
</div>

有什么想法吗?

【问题讨论】:

  • 展平我的数据不是一种选择
  • 能把你的JS代码或者正在迭代的对象贴出来吗?

标签: html angularjs angularjs-ng-repeat


【解决方案1】:

改为:

<div ng-repeat='obj1 in parent' ng-repeat='obj2 in obj1'>
    {{content[obj1][obj2]}}
</div>

为什么不使用嵌套的 ngRepeat,像这样:

<div ng-repeat='obj1 in parent'>
    <div ng-repeat='obj2 in obj1'>
        {{content[obj1][obj2]}}
    </div>
</div>

【讨论】:

  • 嵌套不适用于我的用例,因为之后我需要使用绝对定位来移动 div,它会把所有东西都搞砸。
  • 我认为更改 CSS 代码以适应此解决方案要比构建自己的 ngRepeat 来适应当前的 CSS 代码要容易得多。
  • 我的意思是我在渲染后(使用 jQuery)对所有的 div 进行了一些认真的操作,如果它们被嵌套,它会产生不必要的复杂性。我考虑过这个选项,但我认为这是最后的手段。无论如何,它肯定不能解决问题。
  • 现在我进退两难了。我最终决定尝试您的建议,尽管我会注意到我很早就想到了它并认为它太混乱了。你让我重新考虑它,它运行良好,无需进一步使用 CSS。现在一方面我使用了您的解决方案,但另一方面,它并没有真正解决原始问题,该问题明确规定不要使用嵌套的ng-repeat。你怎么看?我觉得我想将赏金奖励给可以向我展示我不知道的新角度特征的人。
  • 我的回答是为了煽动对话,因为您从未指定为什么不能使用嵌套的 ngRepeats。就我个人而言,这似乎是一个理想的解决方案,因为您可以通过最少的努力 实现您所寻找的。 AFAIK,这没有 Angular 功能 - 您必须编写自己的指令,该指令使用嵌套循环遍历两个集合并操作 DOM,就像 ngRepeat 一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
相关资源
最近更新 更多