Angular - mat-grid-list 不显示 传递的子项

2024-04-22

我正在使用角度材料设计组件,并想要创建一个自定义网格列表组件。该组件将根据其大小调整网格列表列的数量。组件模板如下所示:

<mat-grid-list [cols]="adaptiveCols">
    <ng-content></ng-content>
</mat-grid-list>

该组件将像这样使用:

<my-grid>
    <mat-grid-tile>tile_content</mat-grid-tile>
    <mat-grid-tile>tile_content</mat-grid-tile>
    <mat-grid-tile>tile_content</mat-grid-tile>
</my-grid>

所以你会认为这会显示一个<mat-grid-list> with 3 <mat-grid-tile>其中包含 s,生成的 DOM 将包含这些元素。但您看不到图块及其内容。

将更多图块添加到网格列表并使用固定rowHeight不影响height- 网格列表的属性(据我所知,网格列表根据图块的数量和列/行跨度计算其高度)。这让你认为网格列表没有“看到”<mat-grid-tile>-孩子们。看着网格列表的源代码 https://github.com/angular/material2/blob/8830486039d98d29a9dcf356bbcd7a8124a02478/src/lib/grid-list/grid-list.ts#L137并设置断点_layoutTiles()证实了这一点,在这个方法中this._tiles是空的。
我的猜测是有角度的ContentChildren-注释(here https://github.com/angular/material2/blob/8830486039d98d29a9dcf356bbcd7a8124a02478/src/lib/grid-list/grid-list.ts#L68)在第一个代码片段中找不到tile-children,因为它只适用于DOM的第一层,而第一层我们只有<ng-content>.

期望的结果很明确,我希望能够使用自定义网格列表组件,给它一些子组件并使用它的功能。但由于某种原因,Angular 不希望我成功,或者我还有东西要学。

我使用的是 Angular 6.1 并使用以下命令安装了材料组件官方文档 https://material.angular.io/.


mat-grid-list 在其自己的实现中使用内容投影,因此它需要能够查询其投影内容。尝试添加另一个级别的内容投影使得这是不可能的,因为 mat-grid-tile 实际上不是由列表投影的,而是由您的组件投影的。

简短的回答:这行不通。

可能有一种方法可以实现您的目标,但内容投影不是方法。如果你稍微澄清一下你的意图,我也许能帮上忙。不过,您可能需要使用模板。

这是一个简单的情况:围绕 mat-grid-list 编写一个包装器,该包装器接受数据数组作为输入,您可以使用 ngFor 对其进行迭代以创建图块

@Component({
  selector: 'my-grid',
  templateUrl: './my-grid.html'
})
export class MyGrid {
  @Input() data: string[];
}


<mat-grid-list>
  <mat-grid-tile *ngFor="let d of data">{{d}}</mat-grid-tile>
</mat-grid-list>

这为 mat-grid-list 提供了一个可重用的包装器,为您抽象了一些内容。但是,如果您的网格内容比字符串(可能)更复杂或者每次使用都需要自定义模板,那么这就不太好了。在这种情况下,您需要一种更精细的方法,使用模板和指令:

@Directive({
  selector: 'gridTemplate'
})
export class GridTemplate {
   @Input() key: string;
   constructor(private elementRef: ElementRef, public template: TemplateRef<any>) {}
}

该指令将识别您的自定义模板,然后在网格列表中,您可以使用这些模板来填充图块

@Component({
  selector: 'my-grid',
  templateUrl: './my-grid.html'
})
export class MyGrid implements AfterContentInit {
  //structure the data so it can be assigned to a template by key
  @Input() data: {templateKey:string, data: any}[];

  //use content children to find projected templates
  @ContentChildren(GridTemplate)
  gridTemplates: QueryList<GridTemplate>;

  gridTemplateMap: {[key:string]: TemplateRef<any>} = {};

  ngAfterContentInit() { 
    //store queried templates in map for use in template
    this.gridTemplates.forEach(t => this.gridTemplateMap[t.key] = t.template);
  }
}


<ng-template #defaultGridTemp let-d="data">{{d}}</ng-template>
<mat-grid-list>
  <mat-grid-tile *ngFor="let d of data">
    <!-- here we use the template map to place the correct templates or use a default -->
    <!-- we also feed the data property as context into the template -->
    <ng-container [ngTemplateOutlet]="(gridTemplateMap[d.templateKey] || defaultGridTemp)" 
                  [ngTemplateOutletContext]="{ data: d.data }" ></ng-container>
  </mat-grid-tile>
</mat-grid-list>

那么你的组件的用法是这样的:

@Component({...})
export class MyComponent {
   data = [
    { templateKey:'MyKey1', data: {message: 'Projected Message', number: 1} },
    { templateKey:'MyKey2', data: {whatever: 'Message', youWant: 'to place'} }
   ];
}


<my-grid [data]="data">
  <ng-template gridTemplate key="MyKey1" let-d="data">
     <div>{{d.message}}</div>
     <div>{{d.number}}</div>
     <div>Any other arbitrary content</div>
  </ng-template>
  <ng-template gridTemplate key="MyKey2" let-d="data">
     <div>{{d.whatever}}</div>
     <div>{{d.youWant}}</div>
     <div>Any other arbitrary content</div>
  </ng-template>
</my-grid>

通过这种方法,您可以将任何可重用逻辑添加到网格组件内所需的 mat-grid-list 中,但仍保持为网格提供自定义模板的灵活性。缺点是您必须采取额外的步骤来构建数据才能利用此方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular - mat-grid-list 不显示 传递的子项 的相关文章

随机推荐

  • 一个 AndroidManifest.xml 中包含两个 searchable.xml 活动

    我有一个 Android 应用程序 其中有一些不同的活动用于浏览从 RSS 下载的文章和图像 我希望能够提供连接搜索对话框中的搜索按钮 http developer android com intl zh TW guide topics s
  • 如何使用 PhantomReference 作为 Finalize() 替代

    Javadoc 8 的虚拟参考 http docs oracle com javase 8 docs api java lang ref PhantomReference html状态 虚拟引用最常用于调度验尸前与 Java 终结机制相比
  • Floyd Warshall 算法的时间复杂度

    Skiena 的算法书包含以下解释弗洛伊德 沃歇尔算法 http en wikipedia org wiki Floyd E2 80 93Warshall algorithm floyd adjacency matrix g int i j
  • 从MAC地址获取IP。 arp -a 不显示设备

    我正在尝试编写一个批处理文件 该文件应该在连接到网络 腾达 WiFi 路由器 时找到我的 Android 手机的动态分配的 IP 所以我正在尝试arp a并搜索我手机的 MAC 地址 以便我可以从表中获取其 IP C Users Leero
  • Firestore 增量 FieldValue

    所以 我知道有一些类似名称的问题 但这并不相同 我很好奇是否有人可以解释缺乏的原因increment哨兵 类似于delete one 据我所知 字段删除与文档更新没有什么不同 意思是 我可以delete我的字段只需将整个文档更新为一些新数据
  • 计算非连续值

    所以我有以下结构 guid current level current value pk a 100 12 1 a 200 12 2 a 200 12 3 a 200 12 4 a 200
  • 二分查找条件[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我总是对二分搜索算法的条件感到困惑 并且在编程竞赛中花费了我很多时间 我的问题是何时使用这些条件 1 while low lt high 2
  • 自 Android studio 3.5 起,辅助服务在每次运行时都会自动关闭

    由于我将 Android Studio 更新到 3 5 当我启动 Run 来构建和部署我的应用程序时 我的自定义辅助功能服务会自动关闭 不是崩溃 只是在设置中关闭 你能帮我吗 发生的情况是 Studio 在重新安装新版本之前强制停止该服务
  • 如何使用ng-style设置div的背景图片

    基本上我有一个链接 当单击它时 我会显示一个模式 现在我可以在模态上显示其他属性 例如标题 除了背景图像之外 呃呃 这是模态 div class modalContainer div div style padding top 10px s
  • iTunes Connect 提交代码签名权利错误 Xcode 8

    我在使用 Xcode 8 GM 提交最新的应用程序更新时遇到问题 我在此更新中更新了我的 iPhone 和 watchOS 应用程序 当尝试提交时 我收到以下错误 iTunes Store 操作失败 无效的代码签名权利 你的 应用程序包的签
  • 检测 Twitter 的 iOS 版本?

    显然 我对 Twitter oAuth 令牌请求 的使用在 iOS 5 中不起作用 我如何为 iOS 5 以下的任何内容保留此代码并使用适用于 iOS 5 的新 Twitter 框架 可以检测iOS版本吗 Thanks 您 几乎 永远不想查
  • 将 H.264 I 帧放入 AVSampleBufferDisplayLayer 但不显示视频图像

    在详细回顾了 WWDC2014 Session513 后 我尝试在 IOS8 0 上编写我的应用程序来解码和显示一个实时 H 264 流 首先 我成功构建了H264参数集 当我得到一个带有 4 位起始代码的帧时 就像 0x00 0x00 0
  • 日期比较无法在 Angular js 中工作

    谁能告诉我为什么我的约会对象没有开始工作 基本上 当我尝试比较日期时 它在 angularJs 中不起作用 var dateObj1 filter date Date now dd MMM yyyy output is 04 May 201
  • 从文本字段上的日期选择器设置当前日期

    我正在文本字段上设置日期选择器 为此 这就是我所写的 在viewDidLoad let datePicker UIDatePicker datePicker datePickerMode UIDatePickerMode date date
  • 有没有办法改变模态视图控制器外观的动画样式?

    我正在尝试为两个视图控制器视图的出现和消失设置动画 我使用了以下两行代码 self modalTransitionStyle UIModalTransitionStyleCoverVertical self presentModalView
  • Jest 不会转换模块 - SyntaxError: 无法在模块外部使用 import 语句

    我无法摆脱这个SyntaxError Cannot use import statement outside a module无论我尝试什么 都会出错 而且非常令人沮丧 这里有人解决了这个问题吗 我已经阅读了一百万个 stackoverfl
  • Paypal SandBox IPN 历史

    我使用贝宝付款 为了验证我使用 我可以在 Paypal 沙盒中查看我的 INP 历史记录吗 At the 文档 https cms paypal com cms content US en US images developer IPNHi
  • 如何在编辑器中将动画曲线更改为线性?

    我向轮子添加了旋转动画 但轮子旋转不顺畅 我发现原因是因为旋转动画的曲线不是线性的 然而 在尝试了编辑器中的几乎所有按钮和选项后 我找不到使动画曲线成为线性的方法 有谁知道如何在统一编辑器中获取带有线性曲线的动画 我自己找到了解决方案 而且
  • MySQL:从另一台服务器选择

    恐怕我已经知道问题的答案 但我还是会问 当有两台 MySQL 数据库服务器时 我可以访问另一台服务器上存储的数据吗 换句话说 我能以某种方式这样做吗 INSERT INTO table x y z SELECT x y x y FROM o
  • Angular - mat-grid-list 不显示 传递的子项

    我正在使用角度材料设计组件 并想要创建一个自定义网格列表组件 该组件将根据其大小调整网格列表列的数量 组件模板如下所示