*ngFor 使用函数,返回一个循环

2024-01-01

当我在 Angular 中使用 *ngFor 和返回数据的函数时,该函数会被多次调用,有时甚至会导致循环:

应用程序组件.ts

export class AppComponent {

 getArray(): string[] {

   //here i know when this function is called
   console.log('getArray called')

   return ['number one', 'number two']
 }

}

应用程序组件.html

<h1 *ngFor="let item of getArray()">
 {{ item }}
</h1>

我的控制台:

然后我多次调用 getArray() 函数,但我不知道为什么。


Update

您会看到它被称为乘法时间,因为 Angular 会在每个更改检测周期评估您在模板中使用的所有表达式。变更检测周期开始于ApplicationRef.tick https://github.com/angular/angular/blob/78146c1890b472621acf33d778477db8df816043/packages/core/src/application_ref.ts#L625 method.

当应用程序启动时calls https://github.com/angular/angular/blob/78146c1890b472621acf33d778477db8df816043/packages/core/src/application_ref.ts#L672立即使用该勾选方法,然后由以下人员管理ngZone.onMicrotaskEmpty https://github.com/angular/angular/blob/78146c1890b472621acf33d778477db8df816043/packages/core/src/application_ref.ts#L515订阅。

此外,每个勾选方法都会执行额外的检查检查无变化 https://github.com/angular/angular/blob/78146c1890b472621acf33d778477db8df816043/packages/core/src/application_ref.ts#L638对于开发模式。

所以你得到了

App starts
   loadComponent
      tick
        checkChanges
              evaluate getArray()
        checkNoChanges
              evaluate getArray()
  ngZone.onMicrotaskEmpty
      subscribe(all promised have been executed)
         tick
           checkChanges
              evaluate getArray()
           checkNoChanges
              evaluate getArray()

      ...some time later
      subscribe(you click somewhere)
         tick
           checkChanges
              evaluate getArray()
           checkNoChanges
              evaluate getArray()
      subscribe(you make a http request)
         tick
           checkChanges
              evaluate getArray()
           checkNoChanges
              evaluate getArray()

之前的回答

您应该避免在 Angular 模板中使用执行复杂计算或执行副作用或在每次更改检测运行时返回新值的表达式。

特别是在你的代码中

<h1 *ngFor="let item of getArray()">

您将在每次模板检查时返回一个新数组。 ngForOf 指令检测到您更改了数组并尝试重新渲染它(如果您的项目是对象)。

如果您在代码中定义该数组一次,那就更好了。

arr = ['number one', 'number two']

<h1 *ngFor="let item of arr">

另一种适用于 ngForOf 指令的方法是使用 trackBy,但最好在 item 中拥有一些唯一的键。

See also

  • https://angular.io/guide/template-syntax#no-visible-side-effects https://angular.io/guide/template-syntax#no-visible-side-effects
  • 自定义元素上的 Angular 非常奇怪的错误 https://stackoverflow.com/questions/55677590/angular-very-weird-bug-on-a-custom-element/55678469#55678469
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

*ngFor 使用函数,返回一个循环 的相关文章

  • 如何使用 angular2 的路由器实现面包屑[重复]

    这个问题在这里已经有答案了 I use angular2最近 但不知道如何实施breadcrumb组件 任何人都可以帮忙吗 div class row style padding top 15px ol class breadcrumb l
  • 手动刷新 Angular 之前页面无法正常显示

    我面临着非常奇怪的问题 我的角度应用程序页面显示正确 它似乎没有完全加载 当我手动重新加载 刷新页面时 它的加载正常 这是完整的场景 我创建了一个登录页面 该页面显示完美并按预期工作 登录后 我导航到仪表板页面 该页面未正确显示 似乎加载了
  • 在 Angular 7 项目中读取来自第三方服务器的 SAML 响应

    我已经创建了一个角 7项目 http myproject com 如果用户未登录 我会将用户重定向到另一个安全身份验证服务器 https secureauth com 登录 这里提示输入用户名和密码 然后检查用户凭据 一旦用户成功登录到安全
  • 由于 ngIf 语句,存储选择未运行

    我正忙于 MeteorJS 和 RxJS 它们正在退出 但有时也有点令人困惑 我当前的问题只是 Angular NgRx 问题 与 MeteorJS 无关 正如您在示例中看到的 有一个ngIf基于showChannels 该布尔值设置为fa
  • 如何对 AG-Grid 中标题名称为空的列进行排序

    如何对 AG Grid 中带有空标题的列进行排序 正在传递的 colDef var columnDefs headerName sortable true suppressToolPanel true field 笨蛋 https plnk
  • 使用许多嵌套的 switchMap 是不好的做法吗?

    我有 HTTP 拦截器 在该拦截器中 在更改请求之前 我需要打开一个加载程序 真正让我担心的是我最终会得到很多switchMaps why 加载器是异步的 我还需要将从拦截器传递的消息转换为加载器服务 翻译消息也是异步的 在拦截器中 我应该
  • Angular 2 中的 Observable 和 ngFor

    下面是一个使用 rxjs Observables 的简单示例 Angular 2 组件 import Component OnInit from angular core import Observable from rxjs Observ
  • 组件没有路由配置 - 嵌套路由 angular2 RC1

    我有嵌套路线 Routes path component RootComponent path parent component ParentComponent 二级路由有参数 Routes path id component ChildC
  • Angular 2 + Auth0(找不到模块“auth0-js”的声明文件。)

    找不到模块 auth0 js 的声明文件 C sandbox loginauth0 node modules auth0 js src index js 隐式具有 any 类型 我想使用 auth0 登录 但在按照说明构建我自己的 Angu
  • 使用 karma-jasmine 和 istanbul 的 Typescript 代码覆盖率

    我正在尝试使用伊斯坦布尔在业力框架中获取我的打字稿代码的代码覆盖率 在 karma conf 中包含 typescript 文件 通过 karma typescript preprocessor 我们能够对 typescript 代码进行单
  • 从 Angular 6 服务中绑定图像

    我有一个端点 它根据某些参数为我提供图像 这不是一个图像网址 而是一个普通图像 因此 当我到达邮递员中的端点时 作为响应 我收到一张图像 JPG 我是否可以在变量中接收该图像并将其绑定到 HTML 标签中 所有问题都有将图像 url 映射到
  • TypeScript 中类和命名空间的区别

    到底有什么区别classes and namespaces在打字稿中 我知道 如果您创建一个带有静态方法的类 您可以在不实例化该类的情况下访问它们 这正是我猜想的命名空间的要点之一 我还知道你可以创建多个同名的命名空间 并且它们的方法在编译
  • 传单 - 导入 Geojson - Angular 6

    我尝试将 GeoJson 文件导入到 Angular 的应用程序 6 中的传单中 通过这个解决方案 我的 geojson 是在 leafletmap 中绘制的 但我有这个错误 我无法构建我的应用程序 有人知道一种解决方案吗 错误 TS234
  • Material UI 选择覆盖主题中的位置

    我想覆盖主题中选择字段下拉列表的位置 不必在每个选择上实现它 我尝试过 createMuiTheme overrides MuiSelect select MenuProps getContentAnchorEl null anchorOr
  • Angular 反应式表单:使用单个 formControlName 同步多个输入

    我正在建造一个反应形式 https angular io guide reactive forms在 Angular 11 中 它分为多个 div 项目所有者希望在每个 div 中进行一些重复输入 以便用户可以编辑某个字段 A 的输入 并且
  • 如何按顺序使用 RxJS 可观察量?

    事情是这样的 我有一个 HTTP get 请求 它返回一个 JSON 对象列表 我使用 RxJS 订阅接收该列表的数据 现在 对于该列表中的每个对象 我想执行另一个 HTTP 请求 然后将该请求的结果放入数组中 到目前为止 我已经能够做到这
  • 类型错误:无法读取未定义的属性“post”

    嗨 我只想使用一个简单的功能 http post 将我的日期发布到页面 我希望服务器能够获取我发布的日期 import Component OnInit from angular core import MarginServcies fro
  • AOT 编译器 - 包括延迟加载的外部模块

    我试图将外部模块 托管在 git npm 存储库中 作为延迟加载模块包含在我的 Angular 应用程序中 我正在使用 ngc 编译器编译我的外部模块 node modules bin ngc p tsconfig aot json 这是我
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • 在 Angular 中导入和使用 lodash 的正确方法

    我曾经能够通过如下所示的 import 语句在 Angular 中使用 lodash 方法 import debounce as debounce from lodash 我现在在使用该语句时收到以下错误 node modules type

随机推荐

  • Y 轴中带有长标签的 Recharts 水平条形图的动态高度

    如果 YAxis 中的标签太长 如何动态更改 Recharts 中的 ResponsiveContainer 的高度 这是我的代码
  • 错误:打开模拟器时,在 Windows 8 上找不到抛出的模拟器图像 (avds)

    我正在 ionic 框架中制作一个 cordova 应用程序 我想在模拟器 somfired 命令中测试它ionic emulate android它引发了以下错误 运行命令 ionic emulate android 时 Git Bash
  • ControlSend 使用 SetKeyDelay, 0, 0 时随机发送错误字符(修改和未修改)

    我正在自我回答这个问题 因为我在互联网上看到过这个问题 但几乎没有有用的答案 而且在 Stack Overflow 上也绝对找不到我能找到的解决方案 示例代码 考虑一下这段代码 它只写了几行 shell 命令 0 SetKeyDelay 0
  • 允许多个不同形状的接口作为 TypeScript 返回类型

    我有一个函数 它接受一些参数并生成将传递到外部进程的对象 由于我无法控制最终需要创建的形状 因此我必须能够为我的函数采用一些不同的参数并将它们组装成适当的对象 这是一个非常基本的示例 展示了我遇到的问题 interface T1A type
  • BuildHTTPClient 无法获取构建定义步骤?

    我们使用 BuildHTTPClient 以编程方式创建构建定义的副本 更新内存中的变量 然后将更新的对象保存为新定义 我在用着Microsoft TeamFoundation Build2 WebApi BuildHTTPClient h
  • 在android中显示栏之间的空格

    如何在android中提及条形图的条形之间的空格 Thanks in advance 上面的图片会让你清楚我的疑问 即 蓝色条实际上不适合相应的 x 轴值 这里是 Ord 1 Ord 2 Ord 3 Ord 4 我需要显示这些带有 x 轴值
  • OpenCV 2.3 中的 VideoCapture 问题

    我使用时遇到问题视频截取用于打开 MPEG 视频文件的类 代码已正确编译 但是 在运行期间 它无法打开文件并给出以下警告消息 警告 打开文件时出错 modules highgui src cap ffmpeg impl hpp 477 仅当
  • 使用 JNI 从单独的线程调用静态 Java 方法

    我正在尝试在 android 中使用 JNI 来创建一个函数指针 我正在使用的本机库将其调用转发给 java When initializeStateController被调用 使用创建一个新线程pthread create每当状态控制器的
  • 使用 bash shell 脚本替换文件中的字符串

    我想在文件中找到一个字符串 进行一些操作并将该字符串放回文件中 下面给出的是我需要的示例 cat sample txt TimeStamp gt 123456 Name gt ABC Mail gt email protected cdn
  • 在makefile中写入依赖项,用makefile

    基于一些SO问题 以及发现的一些进一步的参考 我正在尝试构建一个能够 查找 给定目录 SRC the cpp待编译的文件 编译 cpp 生产 o物体 产生 so每个共享对象 o以前编译的 为了实现这一点 make 文件应该做的是 查找 给定
  • 解决方案。有代理时如何install_github

    当您尝试从 GitHub 存储库安装某些 R 包时 install github rWBclimate ropensci 如果您出现以下错误 Installing github repo s rWBclimate master from r
  • 从 mysql 网站检索时未选择数据库

    我有一个 mysql 数据库 我正在尝试从我们的网站主机 godaddy 检索该数据库 我遵循了一种似乎正确的格式 但它告诉我 java sql SQLException No database selected Code public s
  • 无缝循环音频 html5

    有人知道如何实现音频标签的无缝循环吗 我在想一些基于javascript的东西 我有一个循环 比如 1 小节 我希望它循环并保持节奏 所以我需要循环平滑 无间隙 当我简单地将 循环 设置为 true 时 它 会滞后并且不会保持节奏 虽然仍然
  • 在 JBoss Seam 上实现 SOAP Web 服务的最佳方法是什么?

    我需要在 Jboss Seam 2 1 0 上实现 SOAP Web 服务 这个想法是将无状态 bean 方法导出为 Web 服务 然而 我发现了两种方法 第一个是使用 Seam 自己的 Web 服务注释 这样做的问题是缺乏文档 第二个 是
  • C# ASP.NET MVC 控制器单元测试

    我对单元测试有点陌生 我想知道我这样做是否正确 Controller public ActionResult Index return View Message Index TestMethod public void MessageVie
  • 在张量流中compute_gradients返回什么

    mean sqr tf reduce mean tf pow y y 2 optimizer tf train AdamOptimizer LEARNING RATE gradients variables zip optimizer co
  • 在 Angularjs 中处理 $http.get 和 $http.post 错误

    Folks 我在用 http get and http post遍布我的代码 我对如何以全局方式处理这些调用期间发生的错误感到有点迷失 目前我有 success doSomething error doSomething 每次通话时 我想更
  • Lua 模式中的交替运算符是什么?

    在正则表达式中 用于交替 Lua模式中对应的字符是什么 首先 注意Luapatterns http www lua org manual 5 1 manual html 5 4 1不是正则表达式 它们是自己更简单的匹配语言 具有不同的优点和
  • 语音通话期间麦克风录制的音频被静音

    我正在尝试构建从麦克风记录音频以供以后处理的应用程序 除了以下问题之外 一切都运行得很好 在语音通话 传入和传出 期间 录制的文件不会获取任何音频数据 它只包含 NULL 我正在使用 AudioRecorder 和 MediaRecorde
  • *ngFor 使用函数,返回一个循环

    当我在 Angular 中使用 ngFor 和返回数据的函数时 该函数会被多次调用 有时甚至会导致循环 应用程序组件 ts export class AppComponent getArray string here i know when