【问题标题】:Using index and even in a keyvalue pipe使用索引甚至在键值管道中
【发布时间】:2019-04-02 03:46:27
【问题描述】:

我想遍历对象中的键值对并每行显示两个项目。我查看了类似 Example 的其他示例,但我不知道如何向其中添加键值。

这是我的代码:

<div *ngFor="let item of book.bookData.privateData | keyvalue; index as i; let even = even">
    <div fxFlex="100" fxLayout="row" *ngIf="even">
        <div fxFlex="50" fxLayout="column">
            Key: <b>{{book.bookData.privateData[i].key}}</b> and Value: <b>{{book.bookData.privateData[i].value}}</b>
        </div>
        <div fxFlex="50" fxLayout="column">
            Key: <b>{{book.bookData.privateData[i+1].key}}</b> and Value: <b>{{book.bookData.privateData[i+1].value}}</b>
        </div>
    </div>
</div>

这不起作用,因为privateData 对象上没有keyvalue 属性,这些属性被分配给item

提前感谢您的帮助!

编辑:

以下是我正在努力实现的工作示例,但这显然不是一种有效的方法:

<div *ngFor="let item of bookState.bookData.privateData | keyvalue; index as i; let even = even">
    <div fxFlex="100" fxLayout="row" *ngIf="even">
        <div fxFlex="50">
            <div *ngFor="let deeperItem1 of bookState.bookData.privateData | keyvalue; index as i2">
                <div *ngIf="i2 === i">
                    <b>INDEX {{i2}} and {{i}} </b>Key: <b>{{deeperItem1.key}}</b> and Value: <b>{{deeperItem1.value}}</b>
                </div>
            </div>
        </div>
        <div fxFlex="50">
            <div *ngFor="let deeperItem2 of bookState.bookData.privateData | keyvalue; index as i3">
                <div *ngIf="(i3-1) === i">
                    <b>INDEX {{i3}} and {{i}} </b>Key: <b>{{deeperItem2.key}}</b> and Value: <b>{{deeperItem2.value}}</b>
                </div>
            </div>
        </div>
    </div>
</div>

EDIT2:

要指定问题:问题不在于键值管道不起作用,问题在于如何有效地向这些管道添加索引以显示每行项目的 x 数量(在我的情况下为 2)。 造成误会请见谅!

【问题讨论】:

  • 你能添加一个你正在循环的模式吗?项目中有什么?
  • keyvalue 管道到底在做什么或试图做什么?可以分享pirvateData的界面吗?
  • privateData 包含任意数量的键值对作为 JSON 响应。 key 和 value 都是字符串。

标签: angular angular6 ngfor


【解决方案1】:

这取决于您正在迭代的结构。 Here你可以找到下面的例子:

@Component({
  selector: 'keyvalue-pipe',
  template: `<span>
    <p>Object</p>
    <div *ngFor="let item of object | keyvalue">
      {{item.key}}:{{item.value}}
    </div>
    <p>Map</p>
    <div *ngFor="let item of map | keyvalue">
      {{item.key}}:{{item.value}}
    </div>
  </span>`
})
export class KeyValuePipeComponent {
  object: {[key: number]: string} = {2: 'foo', 1: 'bar'};
  map = new Map([[2, 'foo'], [1, 'bar']]);
}

在您的情况下,如果您没有键值结构,请像这样使用 map 情况:

<div *ngFor="let item of book.bookData.privateData | keyvalue; let i=index">
    <div fxFlex="100" fxLayout="row" *ngIf="i%2 === 0">
        <div fxFlex="50" fxLayout="column">
            Key: <b>{{item.key}}</b> and Value: <b>{{item.value}}</b>
        </div>
        <div fxFlex="50" fxLayout="column" *ngIf="(book.bookData.privateData|keyvalue)[i+1]">
            Key: <b>{{(book.bookData.privateData|keyvalue)[i+1].key}}</b> and Value: <b>{{(book.bookData.privateData|keyvalue)[i+1].value}}</b>
        </div>
    </div>
</div>

【讨论】:

  • 您的答案有效,但每行不显示两个项目
  • @lennertr 发布您的array 结构,以便他可以重组他的代码
  • 这是一个非常棘手的问题,但我终于找到了解决方案。您可以使用(array|pipe) 在视图中应用管道,并使用(array|pipe)[i+1] 访问下一个元素。使用*ngIf="(book.bookData.privateData|keyvalue)[i+1]" 确保下一个元素存在希望有所帮助。我更新了我的答案。
  • 非常感谢@Tommy!这就是我要找的:)
  • 后续问题:你能想出一种在其中使用双向数据绑定的方法吗? &lt;input matInput placeholder="{{item.key}}" [(ngModel)]="item.value"&gt; 仅以一种方式工作,它不会存储对对应键的 book.bookData.privateData 对象的更改。
【解决方案2】:

@lennertr 请将您的角度版本更新为 6.1.0 以使用键值管道。 因为 keyvalue 从版本 6 开始可用。 请参考下面的演示。

https://stackblitz.com/edit/angular-keyvalue

【讨论】:

  • 这不是问题。我使用的角度版本大于那个,并且键值管道工作正常。问题是如何使用带有键值管道的索引来显示每行特定数量的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
相关资源
最近更新 更多