- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的印象是 trackBy
函数仅在尝试优化 *ngFor
的性能时使用,因此如果发生变化,DOM 不会待重建。
但是,最近,我遇到了一种情况,trackBy
实际上修复了错误的行为。
以此为例:https://plnkr.co/edit/nRgdwoiKAMpsbmWaoMoj?p=preview重点关注爱好部分,尤其是 HTML:
<div>
<h2>Hobbies</h2>
<div *ngFor="let h of user.hobbies; trackBy:customTrackBy; let i = index">
#{{i}} - {{h | json}}<br />
<input [(ngModel)]="h.name" name="hobby_name_{{i}}" /> <br /><br />
<select [(ngModel)]="h.type_id" name="type_{{i}}">
<option *ngFor="let t of types" [value]="t.id">{{t.type}}</option>
</select>
<br />
<br />
<button class="btn btn-warn" (click)="remove(i)">Remove</button>
<br /><br />
</div>
</div>
我必须在第一个 *ngFor
中显式定义这部分:trackBy:customTrackBy
。如果删除 trackBy
,则执行以下步骤:
在这种情况下,第一个项目的输入将替换为第二个项目的内容(两个字段具有相同的内容),但是模型中的值是正确的。
trackBy
解决了这个问题,但是为什么呢?
我真的很感激任何形式的解释。如果这不是提出此类问题的正确位置,请将我重定向到正确的位置。谢谢。
更新
以下是错误行为的示例:https://plnkr.co/edit/u8YajKfHcPiVqY0WcJt7?p=preview删除第一个项目(循环)并添加一个新项目(添加按钮),然后查看两个值如何获得相同的默认值(即使模型保持正确,BF 也会被“默认值”替换)。
最佳答案
*ngFor
默认情况下按对象标识跟踪项目。
如果您有原始值(例如字符串数组),并在
中使用它们<div *ngFor="let item of items; let i=index">
<input [(ngModel)]="item" name="item{{i}}">
</div>
并且您编辑了一项,那么 *ngFor
就会遇到麻烦,因为编辑的项的标识已更改。
使用ngForTrackBy
,您可以告诉*ngFor
按索引跟踪项目,然后上面的代码在您编辑字段时可以正常工作。
另一个用例是当您希望 *ngFor
通过某些自定义对象 ID 属性而不是对象标识来跟踪项目时。
关于javascript - Angular 2 - trackBy 函数,它到底有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43262089/
这对你们来说可能很简单,但由于我是java新手,所以我想知道实际上什么是 接下来的部分会发生什么? if (args.length > 0) { file = args[0]; } publi
在我的 View Controller 中,我将 UITapGestureRecognizer 添加到 self.view。我在 self.view 之上添加了一个小 View 。当我点击小 View
我今天尝试从 Obj-C 开始并转到 Swift,我正在阅读文档。我试图在 Swift 中创建一个简单的 IBOutlet,但它不断给我这些错误。 View Controller 没有初始化器 req
我正在尝试使用 VIM 完成(字典和当前缓冲区),但我遇到了问题?和 !在方法名称的末尾。我能以某种方式向 vim 解释方法名称(基本上是单词)最后只能有它,而且只有一个,即 method_name
我是一名优秀的程序员,十分优秀!