Angular模板绑定,多次调用回调函数

2024-03-22

我尝试实现一个包含结构化数据的网格组件columns definition和它的data array.

有一个callback每列定义中的函数,用于自定义显示该列的值。

每一个里面callback,它调用了 console.log() 来显示回调函数将被调用多少次。

我不知道为什么回调函数一开始就调用了四次,并且two times after changeSort()活动已启动!请告诉我。

我编写了下表组件:

import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'app-table',
  templateUrl: './table.component.html',
  styleUrls: ['./table.component.css']
})
export class TableComponent implements OnInit {

  // @Input() public grid: {
  //   columns: any[],
  //   data: any[]
  // };

  public grid: any;

  constructor() {
    this.grid = {
      columns: [],
      data: [],
    };
  }

  ngOnInit() {
    this.grid = {
      data: [
        {
          desc: 'hello 1',
          header: 'my header 1'
        },
        {
          desc: 'hello 2',
          header: 'my header 2'
        },
        {
          desc: 'hello 3',
          header: 'my header 3'
        }
      ],
      columns: [
        {
          title: 'Description',
          field: 'desc',
          sortable: false,
          callback: (value) => this.myCallback1(value),
        },
        {
          title: 'Header',
          field: 'header',
          sortable: true,
          callback: (value) => this.myCallback2(value),
        },
      ],
    };
  }

  public changeSort(field) {
    console.log(field);
  }

  public myCallback1(value) {
    console.log('myCallback', value);
    return value + ' mc1';
  }

  public myCallback2(value) {
    console.log('myCallback2', value);
    return value + ' mc2';
  }

}

它的模板是这样的:

<div class="table-responsive">
  <table class="table table-striped table-sm">
    <thead>
    <tr>
      <th>#</th>
      <th *ngFor="let col of grid.columns">
        <span (click)="changeSort(col)" *ngIf="col.sortable">{{col.title}}</span>
        <span *ngIf="!col.sortable">{{col.title}}</span>
      </th>
    </tr>
    </thead>
    <tbody>
    <tr *ngFor="let row of grid.data; let i = index">
      <td>{{i+1}}</td>
      <td *ngFor="let col of grid.columns">{{col.callback ? col.callback(row[col.field]) : row[col.field]}}</td>
    </tr>
    </tbody>
  </table>
</div>

这是开头的日志错误:

myCallback hello 1
myCallback2 my header 1
myCallback hello 2
myCallback2 my header 2
myCallback hello 3
myCallback2 my header 3
myCallback hello 1
myCallback2 my header 1
myCallback hello 2
myCallback2 my header 2
myCallback hello 3
myCallback2 my header 3
myCallback hello 1
myCallback2 my header 1
myCallback hello 2
myCallback2 my header 2
myCallback hello 3
myCallback2 my header 3
myCallback hello 1
myCallback2 my header 1
myCallback hello 2
myCallback2 my header 2
myCallback hello 3
myCallback2 my header 3

Angular 处理模型和 dom(组件和模板文件)之间的绑定。为此,应用程序会勾选(更改检测周期)并检查是否有任何值已更改,如果是,则更新 dom。

问题是当你的模板文件中有函数时,每个循环角度都会调用该函数来检查“值”是否已更改。

例如,如果我有一个仅返回一个值的简单 get 函数,Angular 需要运行它来检查是否确实存在更改。

{{ myValue() }} // in the template file

myValue() { return 10 } // in the component

在这里,Angular 必须调用每个函数来检查值是否已更改,这是有道理的。

一个解决方案(如果您不希望 Angular 不断调用您的函数)是实现 ChangeDectionStrategy (https://angular.io/api/core/ChangeDetectionStrategy https://angular.io/api/core/ChangeDetectionStrategy)。 有了这个,你可以告诉 Angular 你将处理更新,以及它何时应该运行周期(仅适用于该组件)。

为此,您将在组件元数据中添加以下内容:

@Component({
  selector: 'app-table',
  templateUrl: './table.component.html',
  styleUrls: ['./table.component.css'],
  changeDetection: ChangeDetectionStrategy.OnPush // the new line
})

然后在构造函数中:

constructor(private changeDetectorRef: ChangeDetectorRef) {}

每当您进行更改时,您都可以致电this.changeDetectorRef.markForCheck();它将手动运行该组件的循环并在需要时更新 dom。

我真的建议更多地阅读这一点,因为这个主题太宽泛,无法在这篇文章中描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular模板绑定,多次调用回调函数 的相关文章

  • Angular 生产构建中出现无效或意外令牌错误

    chunk 0 runtime 06daa30a2963fa413676 js runtime 06daa30a2963fa413676 js map runtime 1 5 kB entry rendered chunk 1 main 9
  • Angular 2.0 是否有类似于 Angular 1 中的 `$setPristine` 函数?

    提交表格后 pristine输入的状态仍然是 假 我不知道如何重置pristine陈述为真 在 Angular 1 中 我会使用 setPristine功能 我查看了 API 和开发人员指南 没有 API 可以将输入重置为原始状态 Inst
  • Angular 7 将文件内容发布为 multipart/form-data

    我在字符串变量中提供了要发布的内容 我想使用 import HttpClient from angular common http 为了达到与以下相同的效果 curl F email protected cdn cgi l email pr
  • 垫子选择面板最小宽度

    我正在尝试使用多个复选框自定义垫选择 由于某种原因 面板的最小宽度错误 如下所示 我不知道它在哪里计算这个最小宽度 我还尝试添加 panelClass 并覆盖此类的最小宽度 例如
  • 带有 Angular2+ 的 dc.js 图表

    有人将 dc js 与 Angular2 应用程序一起使用过吗 任何帮助或指示将不胜感激 我能够使我的应用程序在正常的 html java 脚本上运行 现在我需要在 Angular 2 应用程序中实现相同的功能 Edit 几周后 我有了更好
  • 类型“Promise”上不存在属性“finally”

    我试图对承诺使用finally 方法 但我不断收到此错误 Property finally does not exist on type Promise
  • 注解和装饰器有什么区别?

    我很困惑何时使用术语注释以及何时使用装饰器 Component selector tabs template export class Tabs 装饰器对应于在类上调用的函数 而注释是使用 Reflect Metadata 库在类上设置的
  • 装饰器不支持函数调用

    我在 ng build prod 时遇到问题 装饰器不支持函数调用 但在 initialState 中调用了 Ui export const initialState AppState userAisles null userItems n
  • 错误:类型 typeof Observable 上不存在属性计时器

    代码如下 import Component from angular2 core import Observable from rxjs Rx Component selector my app template Ticks every s
  • Angular 2 Bootstrap 模态

    我正在尝试将 Bootstrap Modal 对话框包装在 Angular 2 组件 指令 虽然运气不太好 我看过https github com shlomiassaf angular2 modal https github com sh
  • Angular2 RxJS从地图函数调用类函数

    我是 Angular 2 和 Observables 的新手 所以如果我的问题微不足道 我深表歉意 无论如何 我正在尝试使用 RxJS 测试 Angular 2 HTTP 客户端 虽然我让它工作了 但我需要向我当前正在处理的服务添加更多逻辑
  • Angular2 - 在 SystemJS 中导入第 3 方 javascript

    由于某种原因 fileSaver 没有被映射 angular2 jwt 工作正常 I did npm install file saver save获取文件保护程序 然后按如下方式引用它 我有一个 gulp 任务将 js 文件移动到 lib
  • Angular flex-layout - fxLayoutGap 导致包裹行末尾出现恼人的间隙

    使用fxLayoutGap 和wrap 在被换行的每一行的末尾留下令人讨厌的边距 有没有办法来解决这个问题 https stackblitz com edit angular fxlayoutgap calc mralnz file app
  • Angular 2 变更检测是如何工作的?

    在 Angular 1 中 更改检测是通过对 scope 层次结构进行脏检查来进行的 我们会在模板 控制器或组件中隐式或显式创建观察者 在 Angular 2 中 我们不再有 scope 但我们确实重写了 setInterval setTi
  • 让管道自我刷新角度

    我有来自后端的静态时间戳 我想每 1 秒刷新一次管道以获取现在的日期 这是我的烟斗 import Pipe PipeTransform from angular core import moment from moment Pipe nam
  • 在 Angular 2 中进行并行调用 http get 或 post 调用

    如何在 Angular 2 中进行并行调用 HTTP get 或 post 调用 我有 2 个服务电话 其中一个愈伤组织的响应必须拨打另一个电话 有人可以建议我如何通过错误处理场景进行这些并行调用吗 如果您的服务是Observable基于而
  • 将 Angular 项目从 StackBlitz 导出到本地

    我想导出在 StackBlitz 中完成的 Angular 项目 并使用以下命令从 Angular CLI 执行它ng serve就像我们对在本地计算机中创建的 Angular 项目所做的那样 去做就对了 这是您需要点击的地方
  • Angular 2 可观察间隔锁定 UI

    当我使用Observable Interval要执行 UI 的 http 刷新 如果间隔太快 它会锁定 UI 上的按钮 使其无法工作 按钮没有记录点击 似乎是一个计时问题 如果我增加时间并因此错过了 get 调用 则按钮可以工作 但数据会延
  • Angular 2 路由器使用 Observable 进行解析

    Angular 2 RC 5 发布后引入了路由器解析 Here https angular io docs ts latest guide router html resolve guard使用 Promise 演示了示例 如果我使用 Ob
  • 在请求标头中设置 Cookie Angular2

    我是 angular2 的新手 我的服务器 spring 在其响应标头中使用 set cookie 值来响应身份验证 如何将该 cookie 设置为下一次 API 调用的请求标头 我搜索了很多 但找不到合适的解决方案 作为http get

随机推荐

  • 用于编译程序的 G++ -I 选项

    这里有一个小问题 对于我这样一个Linux程序新手来说是无法解决的 现在我有一个需要编译的main cpp程序 有一个 include Down h 在文件的前面 实际上 这个头文件存在于另一个目录中 位于 include目录 另外 Dow
  • DAX 度量:动态地仅首先考虑每个组,然后总体返回其计数

    我们正在努力解决一个可能比我想象的更简单的问题 我只是被困住了 问题包括定义一个DAX Measure that 动态地仅计数first期间访问量对于每位患者 访问次数是不是第一期间必须是分配空白 价值 在讨论目标之前 请让我介绍一下场景
  • 数据库传输/服务器设置期间波兰字符集出现编码错误

    我正在尝试将我的一个数据库从一台主机 home pl 传输到另一台主机 我新设置的服务器 我试图传输的脚本是wordpress 不幸的是 无论使用哪种方法 我都在努力解决编码问题 新主机配置 在我的新服务器中 我在 my cnf 中使用以下
  • 从 java 加载库时出现“未定义符号:__cxa_pure_virtual”错误

    我有一个 Java 程序 需要加载本机代码库 通过 JNI 和 SWIG 但是当我尝试运行它时 出现如下错误 Exception in thread main java lang UnsatisfiedLinkError usr local
  • 使用 django-import-export 进行 django 迁移中的外键

    我在用着django 导入导出 https github com bmihelac django import export在迁移文件中加载 csv 文件 据我所知 这是 Django 1 7 加载初始数据的当前最佳实践 这对于第一个文件效
  • 如何使用 Git 作为内容分发网络

    Git Internal 一书提到在 p50 上使用 git 作为点对点内容分发网络 但没有提供太多细节 特别是如何拥有多个跟踪不同文件的分支 例子 工作目录 a00 exe a01 exe b00 exe c00 exe c01 exe
  • 倾斜一个角并向对角添加边框半径

    如何使用 CSS 重现这个形状 如何移动右上角 span Shift top right corner span 类似这样的东西 但仍然很难掌握 我会考虑使用图像 span border 2px dashed blue border rad
  • 我收到 TypeError: 'int' object is unsubscriptable

    我从我的代码中收到一条错误消息 上面写着TypeError int object is unsubscriptable 经过一番研究 我明白了它的意思 但我不明白为什么会出现问题 我将问题范围缩小到这段代码 def calcNextPos
  • SVG Circle 元素在比例变换时跳跃

    下面是使用 D3 绘制一个圆并在鼠标悬停时对其进行缩放的代码 它做了它应该做的事情 但也将 cricle 带到其他地方 这意味着圆圈缩放并跳转 翻译 到其他位置 我无法理解其原因 this node this chartLayer appe
  • 直接从浏览器上传字符串到s3,无需本地文件

    我正在使用 javascript node js 和 aws sdk 有很多关于使用签名 URL 直接将现有文件上传到 S3 的示例 但现在我尝试上传字符串并在 S3 中创建文件 而不需要任何本地保存的文件 请问有什么建议吗 请按照此处的示
  • 关于 ASP.Net 中的弹出窗口

    我有一个gridview其中包含一个details button作为最后一栏 My aspx
  • Wildfly 17 服务器提供的 Maven 依赖项

    我刚刚开始使用 Wildfly 服务器版本 17 并且我一直在研究我应该在 pom 文件中提供的依赖项 我在文档中没有找到任何显示所提供的依赖项及其正确版本的内容 作为一个例子 这是我想要的
  • C# 泛型委托类型推断

    为什么 C 编译器无法在指定示例中将 T 推断为 int void Main int a 0 Parse 1 x gt a x Compiler error Cannot convert expression type int to ret
  • C/C++ 中两个 INT_MAX 数字的乘积不正确

    就我而言 两个 INT MAX 数字的乘积是296447233 这是不正确的 long long int product 0 product 2137483647 2137483647 printf product lli n produc
  • 将换行符附加到 NSString

    我有这个 if soapResults nil soapResults soapResults stringByAppendingString n 但我收到警告 构建时来自不同 Objective C 类型的分配 当我在设备上运行它时 我得
  • C++ 反序列化通过 UDP 从 C# 应用程序发送的对象

    我有一个申请c 它连接到另一个应用程序 编写为c 通过UDP 我更喜欢高性能的解决方案 因为我希望测量事件客户端 某些处理服务器端和客户端处理完成的响应之间的时间 本质上是 往返延迟 我有一个 C 对象 例如 public class Pa
  • C# - 显示最大值、最小值和平均值

    我是 C 新手 我一直在致力于这个计划并进行研究 但一无所获 目标是让用户输入数字 多少由用户决定 当他们输入0时 它将停止程序并显示输入的最小数字 输入的最大数字以及输入的所有数字的平均值 我没有收到任何错误 而且我收到了 如果有人可以请
  • Java中删除字符串中的特定字符

    例如 给定一个字符串Battle of the Vowels Hawaii vs Gronzy当我们指定要删除的字符为aeiou 该函数应将字符串转换为Bttl f th V wls Hw vs Grzny 在书上找到这个问题编程面试曝光
  • surfaceDestroyed()何时发生

    我不知道什么时候surfaceDestroyed 发生 我试图让我的线程停止运行surfaceDestroyed 方法 SurfaceView 但似乎我的表面从未真正被破坏 有人可以告诉我什么时候发生这种情况吗 或者说如何触发 每当您单击
  • Angular模板绑定,多次调用回调函数

    我尝试实现一个包含结构化数据的网格组件columns definition和它的data array 有一个callback每列定义中的函数 用于自定义显示该列的值 每一个里面callback 它调用了 console log 来显示回调函