在构造函数中使用 T 创建通用组件

2023-12-12

我正在尝试制作一个通用组件来显示列表资源。我在 HTML 中实例化组件时遇到问题。我正在用这个answer试图解决这个问题,但我觉得这是行不通的。

我有这个组件

<ion-list>
  <ion-item-sliding *ngFor="let entity of entityList" #item>
    <ion-item (click)="navigateToDetail(entity.id)">
      <ion-avatar item-left>
        <img src="http://modexenergy.com/wp-content/themes/modex_wp/img/avatar.png">
      </ion-avatar>
      <h2>{{ entity.email }}</h2>
      <ion-icon name="arrow-forward" item-right></ion-icon>
    </ion-item>
    <ion-item-options side="right">
      <button ion-button color="danger" (click)="delete(entity.id)">
        <ion-icon name="trash"></ion-icon>Delete
      </button>
    </ion-item-options>
  </ion-item-sliding>
</ion-list>

 

export class PageListBaseComponent<T extends IHasId> {

    @Input() entityType: T;
    @Input() detailPageType: any;
    public entityList: T[];

    constructor(public navCtrl: NavController, public navParams: NavParams, public baseProvider: ProviderBase<T>) {

        baseProvider.getList().subscribe(entities => {
            this.entityList = entities;
            console.log(entities);
        });
    }

    delete(id: number) {
        console.log(id);
        //this.baseProvider.deleteById(id).subscribe(result => {
        //    console.log(result);
        //});
    }

    navigateToDetail(id: number) {
        console.log('test ' + id)
        this.navCtrl.push(this.detailPageType, { id })
    }
} 

我从我的用户页面初始化它,如下所示:

<ion-content padding>
  <page-list-base [entityType]="userType" [detailPageType]="userDetailType">
  </page-list-base>
</ion-content>

export class UsersPage {

  public userType: User;
  public userDetailType: ProfilePage;

  constructor(public navCtrl: NavController, public navParams: NavParams) {
  }
}

这不起作用,因为我的组件引用了public baseProvider: ProviderBase<T>在构造函数中,依赖注入无法解析类型。

我希望能够尽可能地重用它。如何正确初始化这个通用组件?如果这是不可能的,那么我怎样才能在 T 解析后稍后获取 baseProvider 呢?


我通过延迟初始化并将依赖关系设置为解决了这个问题@Input财产

export class PageListBaseComponent<T extends IHasId> {

    @Input() detailPageType: any;
    @Input() set baseProvider(provider: ProviderBase<T>) {
        provider.getList().subscribe(entities =>  {
            this.entityList = entities;
            console.log(entities);
        });
    }

    public entityList: T[];

    constructor(public navCtrl: NavController, public navParams: NavParams) 
    {

    }

    navigateToDetail(id: number) {
        console.log('test ' + id)
        this.navCtrl.push(this.detailPageType, { id })
    }
}

然后我修改页面以接受我们的依赖项的具体实现,

export class UsersPage {

  public userDetailType: any = ProfilePage;

  constructor(public navCtrl: NavController, public navParams: NavParams, public baseProvider: Users) {
      console.log(this.userType);
  }
} 

然后我像这样实现该组件:

<ion-content padding>
  <page-list-base [detailPageType]="userDetailType" 
      [baseProvider]="baseProvider"></page-list-base>
</ion-content>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在构造函数中使用 T 创建通用组件 的相关文章

随机推荐

  • Scala 中的 N 皇后

    def queens n Int List List Int Int def placeQueens k Int List List Int Int if k 0 List List else for queens lt placeQuee
  • 仅包含“div”的表格碎片

    当尝试抓取网页时 该表没有 tr 标签 并且是全部 div tags 我试图抓取的站点检查器如下所示 检查员截图 我希望能够从table row类 但刮擦永远不会返回任何东西 使用下面的代码 当我抓取 table header 要不就 pr
  • 列表与字典(最大大小、元素数量)

    我试图确定列表和字典的最大大小 以 RAM 为单位 我也很好奇每个元素 条目可以容纳的最大数量 以及每个条目的内存占用量 我的理由很简单 我和大多数程序员一样 有点懒 这是一种美德 当我编写程序时 我喜欢只编写一次 并尽可能使其面向未来 我
  • 将 8 字节数组转换为 Double

    谈论 Visual Basic 6 我能够找到如何将 Double 转换为 8 字节数组 但反之则不然 在我开始尝试编码之前 是否有一些例程可以执行此操作 例如链接问题中描述的 CopyMemory 在这种情况下可以使用 CopyMemor
  • 查找所有 k 大小的子集,其总和为 n 大小的重复未排序正整数袋

    请注意 这是必需的C NET 2 0项目 不允许使用 Linq 我知道这里已经提出了非常类似的问题 并且我已经生成了一些工作代码 见下文 但仍然希望获得有关如何在给定 k 和 s 条件下使算法更快的建议 这是我到目前为止所学到的 动态规划是
  • Puppeteer 未拾取对话框

    我正在尝试测试 Puppeteer 中的警报框 msg await page goto http localhost 8080 waitUntil networkidle2 await page eval value el gt el va
  • 将新数据插入表中

    我希望对以下问题有所帮助 请注意 此代码从我选择的日期生成一个系数 在本例中为 03 07 dmda 它给出的系数等于 15 55 在这种情况下 我想生成一个新表 其中有一列包含日期 另一列包含与这些日期对应的系数 对于列日期 只有以下日期
  • 使用 selenium python 从隐藏元素中获取文本

    我在 python 中使用 selenium 从网站上抓取信息 但是我遇到了一个问题 当我单击网站从表中获取更多行后 出现的行有一个hidden xs hidden sm我似乎无法找到获取这些元素的方法 我的代码如下 你有什么办法可以帮助我
  • PendingIntent.FLAG_IMMUTABLE 可以替换 PendingIntent.FLAG_UPDATE_CURRENT 吗?

    我正在处理PendingIntent with notification 在我的项目中 我一直在使用PendingIntent FLAG UPDATE CURRENT在一些代码中 它的定义如下 Flag表示如果所描述的PendingInte
  • 使用 BASH 更新通过引用传递的数组

    我想编写一个函数 它采用数组变量名并更新内容 例如 ARRAY1 test 1 test 2 test 3 toUpper ARRAY1 for arg in ARRAY1 do echo arg arg done output arg T
  • 为什么 setTimeout 中的回调即使在严格模式下也会有 this == Window ?

    我现在正在学习 JS 不明白为什么 use strict 指令不适用于 setTimeout 的回调 据我所知 对于 use strict 它应该是未定义的 但始终具有全局对象 function f use strict console l
  • Android、Logcat 和 BufferedReader - 无日志

    我正在制作一个应用程序 它必须在日志中显示我在设备上启动的应用程序 我用logcat ActivityManager I S它在某些设备和模拟器上做得很好 但在某些设备上它有奇怪的行为 我在日志中看到的所有内容都是重复的 02 18 16
  • 在 Eclipse 中克隆后立即取消暂存更改

    我正在使用 Atlassian Stash 和 Eclipse Kepler 的 Git 插件 并且我正在尝试克隆存储库 一旦我完成它 我立即就会得到 N 个未分阶段的更改 其中 N 每次我尝试时都会有所不同 当我尝试比较两个明显不同的文件
  • 使用 PHP 或 javascript 在

    我有一个很长的文本块 我想将这段文本的每 2500 个字符包装成一个 div 这样我就可以对其进行分页 以下不起作用 replace 2500 for 5 for purpose of this example text sfdkjas f
  • 413 请求实体太大 - 文件上传问题

    我正在尝试在我的服务器上上传 30MB 文件 但它不起作用 当我上传 30MB 文件时 页面会加载 找不到网页 当我上传 3MB 文件时 我收到 413请求实体太大 与 nginx 0 6 32 我正在尝试找到 nginx 这样我就可以增加
  • 运行时错误:Python 3.2 pickle.dump 超出了最大递归深度

    我使用下面的代码收到上述错误 错误发生在最后一行 请原谅这个话题 我只是在练习我的Python技能 from urllib request import urlopen from bs4 import BeautifulSoup from
  • QLineEdit 使用按钮显示从鼠标选择中选择的文本

    我想从 a 中获取选定的文本QLineEdit小部件 我们通过单击按钮来获取选定的文本 如果以编程方式选择文本 则它可以工作selectAll 但如果用鼠标选择文本则不起作用 在后一种情况下 显示空字符串 为什么文本有如此大的差异以及如何让
  • 在 Python 中使用 PhantomJS 向下滚动到无限页面的底部

    我已经成功地让 Python 与 Selenium 和 PhantomJS 重新加载动态加载的无限滚动页面 如下例所示 但是如何对其进行修改 以便程序在到达最低点时停止 而不是手动设置重新加载的次数 reloads 100000 set t
  • 在html表格中显示数组

    我有这个数组 Array page gt Array 0 gt add 1 gt edit 2 gt delete 3 gt search category gt Array 0 gt add 1 gt edit 2 gt export 我
  • 在构造函数中使用 T 创建通用组件

    我正在尝试制作一个通用组件来显示列表资源 我在 HTML 中实例化组件时遇到问题 我正在用这个answer试图解决这个问题 但我觉得这是行不通的 我有这个组件