【问题标题】:Is there a way for some components to see an element and some dont when using @Input?有没有办法让某些组件在使用@Input 时看到一个元素而有些却看不到?
【发布时间】:2019-12-09 21:41:46
【问题描述】:

我有这个表格组件,这是它的 HTML。

<p-table 
#dt class="withHighlight" 
[columns]="jobCols" 
[value]="jobList" 
dataKey="id" 
selectionMode="single"
[paginator]="jobList.length > 10" 
[rows]="5"
editMode="row">
<ng-template pTemplate="caption">
   <div style="text-align: left">
      <i class="fa fa-search" style="margin:4px 4px 0 0"></i>
      <input type="text" pInputText size="30" (input)="dt.filterGlobal($event.target.value, 'contains')">
   </div>
</ng-template>
<ng-template pTemplate="header" let-columns>
   <tr>
      <th *ngFor="let col of columns" [pSortableColumn]="col.field">
      {{col.header}}
      <p-sortIcon [field]="col.field" ariaLabel="Activate to sort"
         ariaLabelDesc="Activate to sort in descending order" ariaLabelAsc="Activate to sort in ascending order">
      </p-sortIcon>
      </th>
      <!-- <th *ngIf="isReport">Progress bar</th> -->
      <th style="width:7em">Actions</th>
   </tr>
</ng-template>
<ng-template pTemplate="emptymessage" let-columns>
   <tr>
      <td>No data found.</td>
      <td *ngFor="let col of columns"></td>
   </tr>
</ng-template>
<td>
   {{rowData.configuration_title}}
</td>
<td>
   <app-progress-bar [progressBarOptions]="progressBarOptions">
   </app-progress-bar>
</td>
</tr>
</ng-template>
</p-table>

在这个表格组件中,我制作了一个名为 app-progress-bar 的小型共享组件,表格组件本身就是一个共享组件,目前正在被其他 3 个组件使用,如下所示:

<app-table 
[jobTitle]="jobTitle"
[objectTitle]="objectTitle"
[jobList]="loadJobResponseModel" 
[objectList]="loadJobObjects"
[objectCols]="objectCols"
[jobCols]="jobCols"
[progressBarOptions]="progressBarOptions"
>
</app-table>

我尝试过像这样使用 *ngIf 进行此操作:

<td *ngIf="showProgressBar">
   <app-progress-bar [progressBarOptions]="progressBarOptions">
   </app-progress-bar>
</td>

它可以工作,但我觉得如果我将 *ngIf 放入其中,我的共享组件就失去了意义。

我想仅在这 3 个组件中的 1 个组件中使用此进度组件,但不在其他组件中使用,并且由于我在所有 3 个组件中都使用表格组件 html,我如何告诉表格组件不显示进度不使用 ngIf 吗?

如果我没有解释清楚或者我做错了什么,请提前道歉。

【问题讨论】:

    标签: angular primeng


    【解决方案1】:

    你可以使用你的进度条作为入口组件,并从你想要的组件中渲染它

    https://angular.io/guide/entry-components

    这样你不需要在你的模板中声明组件,你可以从你的控制器实例化进度条

    【讨论】:

    • 我没有使用过入口组件,所以对它们进行了一些研究,看看是否有帮助,谢谢。
    【解决方案2】:

    如果进度条必须是表格组件的一部分,您将需要对子组件进行某种输入来添加或删除进度条。您所做的是正确的,我不认为它失去了意义,只是让您的子组件更具活力。

    如果您不希望所有其他组件都发送 [showProgressBar]="false" 作为输入,您可以将输入设为可选。

    @Input() showPorgressBar?: boolean;
    

    现在,只有当您对进度条感兴趣时,您才需要发送 showPorgressBar 作为输入。

    【讨论】:

    • 我已经这样做了,但是如果我开始在比我目前使用的更多的其他组件中使用我的表组件,那么我必须一直在我添加到表中的每一件事上添加 ngIfs。如果我添加其他类似于我只想在 1 个组件中使用的进度条的东西,那么我必须再次使用 ngIf,也许我的表格组件 html 需要以某种方式重构以处理这些事情我不确定。
    • 这主要取决于您的用例,但如果您将来要渲染多个组件,也许您可​​以使用 ngFor,并发送组件列表并动态加载它们。 angular.io/guide/dynamic-component-loader
    • 我想我将不得不使用类似的东西,我将不得不做一些研究或一些教程,因为我从来没有这样做过。谢谢你的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多