【问题标题】:How to add an offset to an index in a *ngFor angular directive?如何在 *ngFor 角度指令中为索引添加偏移量?
【发布时间】:2019-09-30 07:29:55
【问题描述】:

我想显示来自 json 的一些数据,但我不能简单地向索引添加偏移量并显示来自某个偏移量的所有 te 数据,而是得到 ERROR TypeError: Cannot read property 'id' of undefineddiv 中的文字没有出现。

我已经尝试在html文件中直接添加一个固定的数字,它可以工作(见下面的代码)。但是,当涉及到使用应该使用输入更新的打字稿中的变量“偏移量”(类型:数字)时,返回类型变得未定义并出现错误。我还尝试在我的打字稿文件中使用一种方法,而不是在 html 文件中进行添加,并返回新索引,但它不起作用并显示错误。我还尝试使用{{addition(i,offset)}} 调用该方法并将结果放入我用作索引的变量中,但它仍然显示错误。

例如,这个 html 文件可以正常工作:

<ng-container *ngFor="let article of data; let i = index">
    <ng-container *ngIf="i<(nbElements)">
        <div (click)="checkArticle(data[(i+3)].id)">
            <p class="text-center"> {{data[(i+3)][dataKey]}}</p>
        </div>
    </ng-container>
</ng-container>

div 对我的点击做出反应并显示文本。

然而,这个 html 文件不起作用,即使使用父组件中的输入将偏移量设置为 3(如上面的 html):

<ng-container *ngFor="let article of data; let i = index">
    <ng-container *ngIf="i<(nbElements)">
        <div (click)="checkArticle(data[(i+offset)].id)">
            <p class="text-center"> {{data[(i+offset)][dataKey]}}</p>
        </div>
    </ng-container>
</ng-container>

出现错误。

偏移量(类型:数字)在我的打字稿文件中以这种方式定义,并由父组件更改,并且可以很容易地由子组件使用console.log(offset)显示:

export class AppColumnComponent implements OnInit {
  @Input() offset : number ;

我希望输出是显示我的数据 json 文章的文本,但是当我使用data[(i+offset)] 之类的输入更改偏移量时,结果是一个错误,也许不可能使用其他变量来使用其他索引那是一个固定的数字?

感谢您的支持,这是我在 stackoverflow 上的第一篇文章,希望我做得很好! :)

【问题讨论】:

  • 这是一个XY problem:与其向我们寻求您认为好的解决方案的帮助,不如说明您最初的目标。
  • 另外,如果可以,请在stackblitz.com 上提供minimal reproducible example,这将有助于我们重现行为并为您提供可复制的解决方案。
  • 好的,基本上,我想使用 ngFor 循环来显示一个 json,并向它添加一个寻呼机(偏移量),所以这样,我只需要更改父组件的偏移量即可显示来自某个索引的 json。我够清楚了吗? :) 好的,我正在研究 stackblitz.com 示例,谢谢
  • 说清楚了,我来回答一下!

标签: html angular typescript ngfor


【解决方案1】:

您正在访问超出范围的索引。

data[(i+offset)] 将是 undefined 用于您的 offset 数组中的最后一个元素数量 data 因此您基本上是在尝试执行 undefined.id 这会导致您的错误。 您应该将方法签名更改为仅将索引作为参数接收并在您的 component.ts 文件中处理这种情况

【讨论】:

  • 我尝试使用 data[addition(i,offset)] 在我的 component.ts 中定义添加,例如 addition(a:number,b:number):number { return(a+b) } ,但我仍然得到未定义的错误
  • 是的,这没有任何区别。例如:data[18] 不起作用,如果只有索引 0 到 10 的元素。不要在模板中调用 data[(i+offset)],将 checkArticle 调用更改为 checkArticle(i) 并使用简单的 if 语句进行检查如果i + offset 位置有任何元素可以正确处理这种情况。
  • 好吧,我明白你的意思了,我也要试试
【解决方案2】:

如果你想制作一个分页组件,你不应该仅仅依赖你的 HTML 和一些绑定。

您的组件应该具有“高级”逻辑,因为它应该能够知道它何时到达集合的结束/开始(除其他外)。

基本上是这样的:

  • 获取完整的收藏(比如说 100 件)
  • 按页码将其拼接到您的项目(假设为 10,因此结果范围为 0-10)
  • 测试项目是否在范围之前存在
  • 测试项目是否存在于范围之后
  • 根据这些变量允许/阻止页面更改。

这让你有

  • 集合的 1 个变量
  • 集合子集的 1 个变量(或 1 个管道)
  • 每个页码的项目 1 个变量
  • 1 个偏移变量
  • 2 个布尔值来禁用分页按钮。

尝试解决这个问题,如果您仍然有问题,请提供您尝试过的内容!

【讨论】:

  • 谢谢,我会试试这个,稍后再回复你;)
  • 您好!我几乎完成了分页组件,但使用了 splice 方法,我使用了 slice 方法,它允许我保留我想要显示的数组的确切部分: ``` let fistItem = this.offset;让 lastItem = this.offset+this.nbElements; this.subData = this.data.slice(fistItem,lastItem); ```
  • @robiscuit 我的意思是切自己,我猜只是打错了。太好了!
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多