【问题标题】:Increase performance on Angular2 inputfield提高 Angular2 输入字段的性能
【发布时间】:2016-04-28 12:30:17
【问题描述】:

我有一个包含日期(格式为toLocaleString())和其他内容的组件列表。在它们之上有一个用于创建新组件的组件,它包含一个带有一些使用 angulars FormBuilder 构建的输入字段的表单。 当我快速输入时,验证会滞后,并且我输入的文本不会立即显示。

我假设 Angular 正在重新渲染所有组件,因为如果我不在其他组件中显示日期,我可以快速输入而不会出现延迟。

有没有办法只重新呈现我正在输入的输入字段,因为所有其他组件都无法更改或者是toLocaleString() 的问题?

【问题讨论】:

  • 你能提供样品 plunker 吗?

标签: performance angular angular2-changedetection


【解决方案1】:

有没有办法只重新呈现我正在输入的输入字段,因为所有其他组件都无法更改

是的,对于不会更改的组件,将这些组件的更改检测策略设置为OnPushOnPush 组件只有在

时才会检查更改
  • 它的任何输入属性发生变化
  • 它触发一个事件(例如,单击按钮)
  • 一个 observable(它是一个输入属性或本地到组件的属性)触发一个事件,| async 在模板中与 observable 一起使用(请参阅此答案下方 cmets 中的 plunker)李>
import {Component, Input, ChangeDetectionStrategy} from 'angular2/core';

@Component({
  ...
  changeDetection: ChangeDetectionStrategy.OnPush
})

如果您使用 ngFormControl,还可以考虑通过订阅 valueChanges Observable Angular 来监听您输入的更改,以便在您的表单元素上可用。然后,您可以使用debounce() 仅处理每秒或任何适当时间范围内的更改:

<input type=text [ngFormControl]="input1Control">
constructor() { 
  this.input1Control = new Control();
}
ngOnInit() {
  this.input1Control.valueChanges
    .debounceTime(1000)
    .subscribe(newValue => console.log(newValue))
}

请参阅https://stackoverflow.com/a/36849347/215945 了解工作人员。

【讨论】:

  • 我没有发现任何提及“可观察触发事件”。在this blog 中,他们在subscribe(...) 回调中明确调用markForCheck。也许这只是| async
  • @GünterZöchbauer 请参阅victorsavkin.com/post/110170125256/…stackoverflow.com/questions/35386822/…。在你提到的思想博客中,我不太喜欢他们给出的例子,因为他们只是改变视图状态,所以markForCheck() 是矫枉过正......他们只需要调用detectChanges()。我需要再玩一些(有一天)......因为我不确定维克多说“一个可观察的触发事件”时的真正意思。如果你明白了,请评论。
  • @GünterZöchbauer,我创建了一个Plunker 来测试这一点,你说的是真的:如果一个可观察的输入属性触发一个事件并且模板中使用了| async,那么视图更新。如果不使用async,则视图不会更新。 (Savkin 的博客可能已经过时了。)但这对我来说似乎很奇怪——错误?如果我强制subscribe(),我希望它的工作方式与async 的工作方式相同(即声明性/隐式subscribe() 方式)。
  • cmets 中也有一些关于此的问题,但答案很模糊。我的印象是,他们当时计划让它像魔术一样工作,并以| async 结尾,因为这个用例没有合适的“魔术”。非常感谢您对复制尝试的反馈!
  • @GünterZöchbauer,感谢您:“没有办法像使用异步 API 那样对其进行修补”。我认为它已经/可以修补——即,我认为 subscribe() 已修补。我猜不是。感谢您提出这个问题(即您的原始评论)......这很有趣(即使我为此失眠了)。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2020-01-20
    • 2021-08-16
    • 1970-01-01
    • 2017-05-18
    相关资源
    最近更新 更多