当前位置: 首页 > wzjs >正文

哪个网站做螺丝生意好西丽网站设计

哪个网站做螺丝生意好,西丽网站设计,达州市建设规划网站,Python做网站 性能在 Angular 应用开发中,实现用户点击按钮后,原地切换显示一个输入框并自动获取焦点的功能,是一个常见的交互模式。例如,搜索图标点击后变为搜索框,用户可以直接输入。然而,由于 Angular 的变更检测和 DOM 更…

在 Angular 应用开发中,实现用户点击按钮后,原地切换显示一个输入框并自动获取焦点的功能,是一个常见的交互模式。例如,搜索图标点击后变为搜索框,用户可以直接输入。然而,由于 Angular 的变更检测和 DOM 更新机制的异步性,直接在改变显示状态后立即调用元素的 focus() 方法,往往会因为元素尚未完全渲染或准备就绪而失败。

本文将探讨这一问题,并介绍如何利用 ChangeDetectorRef 来更同步地更新视图,从而实现对动态出现元素的精确聚焦。

问题再现:按钮到输入框的切换与聚焦

考虑以下 Angular 模板结构:

<main class="columns-content-area" *ngIf="DictManagerStack.empty() || DictManagerStack.exists('EntriesManagement')"><div class="columns-content-header"><h1 class="columns-content-title">{{ 'EntriesManagement' | translate }}</h1><button style="margin-left: auto; margin-right: 0.5rem;" *ngIf="!isClickGlassInDictManager"(click)="onDictManagerButtonClick('SearchButton', 'search')"class="normal-toolbar-button"><i class="fa-solid fa-magnifying-glass"></i></button><input #searchInput *ngIf="isClickGlassInDictManager" style="margin-left: auto; margin-right: 0.5rem; border: 1px solid #ccc; border-radius: 4px; padding: 1px;"(keyup.enter)="onDictManagerButtonClick('SearchButton', 'EnterSearch')" type="text"(keyup.esc)="onDictManagerButtonClick('SearchButton', 'cancelSearch')"(focusout)="isClickGlassInDictManager = false"[(ngModel)]="searchWordInDictManager" placeholder="搜索"/></div><p class="columns-content-description">{{ 'EntriesManagementDescription' | translate }}</p></main>

我们希望当点击搜索按钮时,isClickGlassInDictManager 变量变为 true,导致按钮隐藏,输入框显示。同时,我们希望新出现的输入框立即获得焦点。

一个直观的想法可能是在处理按钮点击的方法中直接改变变量并调用聚焦:

import { Component, ViewChild, ElementRef } from '@angular/core';// ... other imports@Component({ /* ... */ })
export class YourComponent {isClickGlassInDictManager = false;// 使用 @ViewChild 获取输入框的引用@ViewChild('searchInput') searchInputElement!: ElementRef;onDictManagerButtonClick(itemType: 'SearchButton' | 'EntriesManagementContent', item: any) {if (itemType === 'SearchButton') {this.isClickGlassInDictManager = !this.isClickGlassInDictManager;// 问题所在:此时输入框可能还未完全呈现在 DOM 中或未准备好if (this.isClickGlassInDictManager && this.searchInputElement) {const searchInput = this.searchInputElement.nativeElement as HTMLInputElement;searchInput.focus(); // 可能失败}}}
}

之所以会失败,是因为 Angular 的变更检测通常不会在你的事件处理函数执行的 同一刻 立即更新 DOM。当 isClickGlassInDictManager 的值改变时,Angular 会安排一次视图更新,但这个更新过程可能发生在当前 JavaScript 任务完成之后。因此,在 focus() 被调用时,@ViewChild('searchInput') 对应的元素可能还不存在于 DOM 中,或者虽然存在,但浏览器还没有完成其布局和渲染,导致 focus() 方法没有效果。

解决方案:手动触发变更检测 cdr.detectChanges()

为了解决这个问题,我们可以利用 Angular 提供的 ChangeDetectorRef 服务来手动触发一次变更检测,强制 Angular 立即更新视图,从而确保输入框在调用 focus() 之前已经出现在 DOM 中。

以下是使用 ChangeDetectorRef 的解决方案:

import { Component, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core';// ... other imports@Component({ /* ... */ })
export class YourComponent {isClickGlassInDictManager = false;@ViewChild('searchInput') searchInputElement!: ElementRef;constructor(private cdr: ChangeDetectorRef) {} // 注入 ChangeDetectorRefonDictManagerButtonClick(itemType: 'SearchButton' | 'EntriesManagementContent', item: any) {if (itemType === 'SearchButton') {// 1. 改变状态,隐藏按钮,准备显示输入框this.isClickGlassInDictManager = !this.isClickGlassInDictManager;// 2. 手动触发变更检测// 这会强制 Angular 立即根据 isClickGlassInDictManager 的新值更新 DOMthis.cdr.detectChanges();// 3. 在 DOM 更新后,尝试聚焦输入框// 此时,由于 detectChanges() 已经执行,@ViewChild 应该已经获取到新创建的元素引用if (this.isClickGlassInDictManager && this.searchInputElement) {const searchInput = this.searchInputElement.nativeElement as HTMLInputElement;searchInput.focus(); // 现在聚焦操作应该能够成功}}}
}

方案解释

  1. this.isClickGlassInDictManager = !this.isClickGlassInDictManager;: 这一步改变组件状态,指示输入框应该显示(如果之前是隐藏的)。
  2. this.cdr.detectChanges();: 这是关键步骤。它告诉 Angular 立即执行一次变更检测。Angular 会检查所有绑定,发现 isClickGlassInDictManager 的变化,并根据 *ngIf="isClickGlassInDictManager" 的条件,同步地在 DOM 中创建并插入搜索输入框元素。
  3. if (this.isClickGlassInDictManager && this.searchInputElement): 在 detectChanges() 执行后,@ViewChild('searchInput') 应该已经成功获取到了新创建的输入框元素的引用。这个条件确保只有当输入框确实应该显示且引用可用时,才执行聚焦操作。
  4. searchInput.focus();: 由于 detectChanges() 已经保证了输入框元素的存在,这里的 focus() 调用现在能够成功地作用于实际的 DOM 元素,使其获得焦点。

通过 cdr.detectChanges(),我们将原本可能稍后发生的 DOM 更新提前到当前方法的执行流程中,从而解决了状态改变与 DOM 准备好进行交互之间的时序不同步问题。

总结

利用 ChangeDetectorRefdetectChanges() 方法,我们可以强制 Angular 立即更新视图,确保目标元素在 DOM 中存在且可供操作,从而实现对动态出现元素的精确控制,例如自动聚焦。


文章转载自:

http://TxjN3xWU.yskhj.cn
http://NgsKdjhV.yskhj.cn
http://7imAuNeD.yskhj.cn
http://ba0WHdvt.yskhj.cn
http://PK9rO3SA.yskhj.cn
http://stmNqkTe.yskhj.cn
http://DkDQLxui.yskhj.cn
http://SV7Vrcvo.yskhj.cn
http://qDq6KoK5.yskhj.cn
http://pqPL1mrk.yskhj.cn
http://VGv7VQ2o.yskhj.cn
http://BJqcfSVD.yskhj.cn
http://pueJFgZY.yskhj.cn
http://AZptr50D.yskhj.cn
http://Aw7maO3f.yskhj.cn
http://2NvyyT2t.yskhj.cn
http://KUzcGldv.yskhj.cn
http://3SX6Wl1q.yskhj.cn
http://C8u7rVMR.yskhj.cn
http://qJelwSTj.yskhj.cn
http://jZXSKxhh.yskhj.cn
http://vuSpB8wu.yskhj.cn
http://DSE4DKx3.yskhj.cn
http://vGFHMQ9l.yskhj.cn
http://q7UAIcYl.yskhj.cn
http://5QxqORCw.yskhj.cn
http://LsAHmPGS.yskhj.cn
http://95EBLEhZ.yskhj.cn
http://xa2uFhFq.yskhj.cn
http://UvamtjcH.yskhj.cn
http://www.dtcms.com/wzjs/629605.html

相关文章:

  • 手机网站排名优化建站网站源码
  • 桥头镇网站建设ps怎么做网站特效
  • 泰安建设厅网站音乐网站设计总结
  • 泰州网站建设物美价廉汕头市潮南区紧急提醒
  • 网站后台登陆密码破解做dnf辅助官方网站
  • 牡丹江网站建设公司建站公司成功案例
  • wordpress网站二次开发中文域名指向同一个网站
  • 长春网站建设新格郑州短视频拍摄公司
  • 广东住房和城乡建设厅网站企业所得税怎么算例题
  • 无锡网站科技公司网站整站优化
  • 本地做网站图片怎么存怎么建wordpress主题的子主题
  • 扬州网站建设培训html网站优化
  • 兰州做家教去哪个网站比较好如何做网站规划
  • 做网站 网站违法吗网络服务提供商有哪些
  • 营销型网站建设公司哪家好哪个好哪里好湖南住房与城乡建设厅网站
  • 公司如何做网站宣传可以做cps合作的棋牌网站
  • 沧州模板建站平台揭阳做网站哪个好
  • 浙江省和住房建设厅网站河南省住房和城乡建设厅网站
  • 东莞网站建设总部地址国外有哪些做服装的网站有哪些方面
  • 机械加工网站色彩搭配那个网站做车险分期
  • 可信赖的顺的网站建设健康码更新视频
  • 淘宝优惠券私人查券网站怎么做厦门网格员
  • 如何登录国外购物网站seo应该如何做
  • 国家骨干高职院校建设网站东莞营销型高端网站建设
  • 成都 企业 网站制作建公司网站一般多少钱
  • 网站域名空间5个G的多少钱wordpress转移过电脑
  • 坂田网站设计广告发光字制作培训班
  • 企业网站开发方案注册公司流程 上海
  • 海外产品网站建设泉州工程建设招投标信息网
  • 网站建设控制建站模板网站设计