如何以角度将预先生成的数组传递给模板中的组件?

Posted

技术标签:

【中文标题】如何以角度将预先生成的数组传递给模板中的组件?【英文标题】:How can I pass pre generated array to component in template in angular? 【发布时间】:2019-05-27 23:26:42 【问题描述】:

我有一个 items 数组并将其循环到一个组件中。单独展示物品道具:

项目数组

const items = [
    
        'name': 'item1', 
        'prop1': 'text1', 
        'prop2': 'text2',
        'boolval': true
    ,
    
        'name': 'item2', 
        'prop1': 'text1', 
        'prop2': 'text2',
        'boolval': false
    ,
    
        'name': 'item3', 
        'prop1': 'text1', 
        'prop2': 'text2',
        'boolval': true
    ];

组件

<div class="all-items">
    <app-items [item]="items"></app-items>
</div>

<div class="specific-items">
    <app-items [item]="items"></app-items>
</div>

HTML

<div class="title">List</div>
<p>Name: item.name</p>
<p>Prop1: item.prop1</p>
<p>Prop2: item.prop2</p>

我想显示 .all-items div 下的所有项目,但在 .specific-itemsboolval=true 属性的项目/strong> 分区。为所有项目生成的 html 如下所示:

<div class="all-items">
    <app-items>
        <div class="title">List</div>
        <p>Name: item1</p>
        <p>Prop1: text1</p>
        <p>Prop2: text2</p>
    </app-items>
    <app-items>
        <div class="title">List</div>
        <p>Name: item2</p>
        <p>Prop1: text1</p>
        <p>Prop2: text2</p>
    </app-items>
    <app-items>
        <div class="title">List</div>
        <p>Name: item3</p>
        <p>Prop1: text1</p>
        <p>Prop2: text2</p>
    </app-items>
</div>

我想显示这样的特定项目;

<div class="specific-items">
    <app-items [item]="items.filter(x => x.boolval=== true)"></app-items>
</div>

<div class="specific-items">
    <app-items>
        <div class="title">List</div>
        <p>Name: item1</p>
        <p>Prop1: text1</p>
        <p>Prop2: text2</p>

        <p>Name: item3</p>
        <p>Prop1: text1</p>
        <p>Prop2: text2</p>
    </app-items>
</div>

如何在 [item]="items.filter(x => x.boolval=== true)" 这样的模板中生成特定数组并将其传递给组件?所以我想在模板中生成一个特定的数组,然后将它发送给组件

【问题讨论】:

您希望.map(x =&gt; x.bool === true) 做什么?这将返回一个 新的布尔数组 您可能想要 .filter 代替(尽管angular.io/guide/pipes,您应该为此使用Pipe)。也就是说,您应该使用组件 getter,或者先生成数组,如果函数(或 getter)执行繁重的操作(如数组映射),将函数(或 getter)绑定到角度组件并不是一个好习惯。 对不起,我拼错了,我已将地图更正为过滤器 x.bool 有错字吗?您的数组项有一个名为 boolval 的字段。 你说得对,我已经更正了,谢谢 【参考方案1】:

您可以创建一个管道来过滤数组。

这里是the final solution

app-items.pipe.ts

@Pipe(
  name: 'appItemsFilter'
)
export class AppItemsFilter implements PipeTransform 

  transform(items) 
    return items.filter(x => x.boolval);
  

你可以像下面这样简单地使用它

<div class="all-items">
  <app-items [items]="items"></app-items>
</div>

<div class="specific-items">
  <app-items [items]="items | appItemsFilter"></app-items>
</div>

另外,这个管道是纯的,这意味着 Angular 不会调用 tranform 方法,除非 items 数组引用更改(pushpop 等操作不会触发更改检测)所以,性能会很多比从模板调用方法更好。

【讨论】:

【参考方案2】:

在角度,你可以试试下面-

    <div class="all-items">
    <app-items *ngFor="let item of items;let i= index">
        <div class="title">List</div>
      <ng-container *ngIf="item.boolval">
        <p>Name: item?.name</p>
        <p>Prop1: item?.prop1</p>
        <p>Prop2: item?.prop2</p>
      </ng-container>
    </app-items>
  </div>

【讨论】:

【参考方案3】:

在stackbliz添加代码

对HTML结构稍作修改,增加了一些条件。

<div class="all-items">
    <app-items [items]="items" case="1"></app-items>
</div>

<div class="specific-items">
    <app-items [items]="items" case="2"></app-items>
</div>

<div class="title">List</div>
<div *ngFor="let item of items">
    <div *ngIf="case == 1 || (case == 2 && item.boolval == true)">
        <p>Name: item.name</p>
        <p>Prop1: item.prop1</p>
        <p>Prop2: item.prop2</p>
    </div>
</div>

【讨论】:

【参考方案4】:

您可以将管道直接传递给数组到 *ngFor

@Pipe(
 name: 'itemsFilter'
)
export class AppItemsFilter implements PipeTransform 

  transform(items) 
   return items.filter(x => x.boolval);
  

在你的 html 中

  <div class="specific-items">
  <app-items>
   <div class="title">List</div>
   <ng-container *ngFor="let item of items | itemsFilter">
      <p>Name: item?.name</p>
      <p>Prop1: item?.prop1</p>
      <p>Prop2: item?.prop2</p>
    <ng-container>
  </app-items>
</div>

【讨论】:

以上是关于如何以角度将预先生成的数组传递给模板中的组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何以角度访问组件模板中的服务变量

以角度将数据从一个组件传递到另一个组件

如何将从服务接收到的 json 数据传递到 Angular 4 的角材料组件中的数组

角度传递数组到另一个(非子)组件

VueJS - 将插槽和作用域插槽向下传递给子模板中的组件

使用Typescript和类组件装饰器时如何将数组传递给Vue中的props