Angular2 中的更改不会更新视图

2023-11-23

我已经开始探索 Angular2(我带着 Angular1 和一些 React 背景而来),但我遇到了一个问题。

我想将某些击键绑定到组件中的操作,因此我决定使用 Angular2 生命周期来绑定/取消绑定操作。

但是,如果我在 Mousetrap 回调中执行某些操作,它会起作用,但不会呈现,并且在运行摘要周期之前更改不可见。

我是否需要显式运行某些内容来更新视图

有人可以帮我弄清楚发生了什么事吗? 任何帮助将不胜感激。


import {Component} from 'angular2/core';
const Mousetrap = require('mousetrap');

@Component({
  template: `<div>
    Video template: Mode {{ mode }}
    <input type="number" [(ngModel)]="mode"/>
  </div>`
})
export class Video {

  public mode: number;

  constructor() {
    this.mode = 0;
  }

  ngOnInit() {

    console.log('hello Video component');
    Mousetrap.bind('d', () => console.log('this.mode=', this.mode));
    Mousetrap.bind('i', () => this.incrementMode()); // doesn't work

    this.incrementMode(); // works
    this.incrementMode(); // works
    setTimeout(() => this.incrementMode(), 4000); // works

  }

  incrementMode() {
    console.log('incMode', this.mode++);
  };

  ngOnDestroy() {
    console.log('bye bye Video component');
    Mousetrap.unbind(['d', 'i']);
  }

}

虽然@Günter的答案是绝对正确的,但我想提出一个不同的解决方案。

问题在于Mousetrap库是它创建它的实例角的外面zone (see here)。但是为了在每个异步事件之后触发更改检测,应该实例化实例角内zone。您有两种选择来实现此目的:

  1. 使用依赖注入:
bootstrap(App, [provide(Mousetrap, { useFactory: () => new Mousetrap() }) ]);

// ...

@Component({
  selector: 'my-app', 
  // ...
})
export class App {
  constructor(@Inject(Mousetrap) mousetrap) {
    this.mousetrap = mousetrap;
    // ...
  }
  //...
}
  1. 只需创建实例Mousetrap构造函数内部:
@Component({
  selector: 'my-app', 
  // ...
})
export class App {
  constructor() {
    this.mousetrap = new Mousetrap();
    // ...
  }
  //...
}

在这两种情况下,您都可以像这样使用 mousetrap 实例:

ngOnInit() {
  this.mousetrap.bind('i', () => this.incrementMode()); // It works now!!!
  // ...
}

现在你不需要使用ngZone.run()在每一个bind call。如果是依赖注入,你也可以使用这个mousetrap应用程序的任何组件/服务中的实例(不仅在App成分)。

See 这个笨蛋。我在那里使用依赖注入。

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

Angular2 中的更改不会更新视图 的相关文章

随机推荐

  • 如何通过PHP删除文件?

    如果文件位于另一个目录中 如何使用 PHP 从服务器中删除该文件 这是我的页面布局 projects backend removeProjectData php 此文件删除了我在数据库中的所有条目 并且还应该删除相关文件 public fi
  • pandas astype 类别不起作用

    我厌倦了将列更改为catgeory使用来自的文档http pandas pydata org pandas docs stable categorical html df pd DataFrame A 1 2 3 4 5 B a b c d
  • 为什么这条 Scala 行返回一个 Unit?

    下面是一段 Scala 代码 用于对 1 到 9 之间可被 3 或 5 整除的值求和 为什么第 5 行返回 Unit 而不是 Boolean 类型 object Sample def main args Array String val a
  • Web Worker 内部的 DOM 操作

    我知道工人can t直接操作文档 但是 DOM API 方法怎么样 他们去哪儿了 例如 如果我发出一个接收 HTML 片段的请求 如果只需要解析它以便从特定节点检索一些数据 我应该做什么 绝对有no way在 Web Worker 上使用虚
  • 请求:如何禁用/绕过代理

    我收到一个网址 r requests get http myserver com 正如我在 myserver com 的 access log 中看到的 使用了客户端的系统代理 但我想完全禁用代理requests 我目前知道禁用代理的唯一方
  • 如何在android中获取当前位置的邮政编码或区号?

    我想获取我的应用程序的 Android 设备中当前位置的邮政编码 以及找到它的任何示例或片段 我尝试过地理编码器 它仅提供纬度和经度位置 那你显然没有使用它 Geocoder geocoder new Geocoder this Local
  • 有没有办法将子例程的打印输出捕获到变量,以便我可以将其发送到 stderr?

    假设我们有 sub test print testing n 如果我想将其打印到 stderr 而不是 stdout 有没有办法可以调用子例程来执行此操作 或者我可以将输出捕获到变量然后使用警告吗 我对 Perl 还很陌生 就在这里 pri
  • 如何在录制时将音频添加到视频中[连续捕获活动] [Grafika]

    我使用实现视频录制ContinuousCaptureActivity java 工作完美 现在我想在此视频中添加音频 我知道使用媒体混合器可以在视频中添加音频 但问题是我不知道如何使用MediaMuxer 另外 如果您有任何其他解决方案而无
  • R,将多行文本数据框合并到一个单元格中

    我有一个如下所示的文本数据框 gt nrow gettext df 1 3 gt gettext df gettext 1 hello 2 Good to hear back from you 3 I ve currently writte
  • git github无法推送到原点

    我可能遗漏了一些东西 但我确信我已经检查了所有内容 我分叉了一个存储库并将其克隆到我的系统上 做了一些改变 提交后 做过git push origin master it says fatal remote error You can t
  • 如何让AngularJS编译指令生成的代码?

    请帮助我 我们如何让 AngularJS 编译指令生成的代码 您甚至可以在这里找到相同的代码 http jsbin com obuqip 4 edit HTML div names 0 names 1 br div
  • 异常 android.support.multidex.MultiDexApplication 无法转换类

    我有一个问题 我的应用程序生成此异常 但我不明白 我已经在 build gradle 中实现了 multiDexEnabled Caused by java lang ClassCastException android support m
  • 将 Log4j 输出写入 HDFS

    有没有人尝试过write log4j日志档案直接地to Hadoop分布式文件系统 如果是 请回复如何实现这一点 我想我必须为它创建一个Appender 是这样吗 我的需要是以特定的时间间隔将日志写入文件 并在稍后阶段查询该数据 我建议使用
  • 从 C# 中的字符串文件路径中删除多余的反斜杠“\”

    如何转换 String path C Abc Omg Why Me into String path C Abc Omg Why Me 我的做法是首先reverse the string进而移除所有 the 直到我们得到first char
  • IntelliJ Idea 中无副作用方法的未使用结果的警告

    当我不分配结果时BigDecimal divide 方法到变量时 我从 IntelliJ Idea 收到了一个很好的警告 BigDecimal divide 的结果被忽略 我可以以某种方式为我自己的 无副作用 函数获得相同的警告吗 比如为我
  • 创建常量字典对象

    我想完成一些类似于这篇文章中所做的事情 Objective C 中的常量 但是 我想构造一个 NSDictionary 如果我做类似的事情 常量 h extern NSArray const mFooKeys extern NSArray
  • 如何让matplotlib准确放置线条?

    默认情况下 matplotlib 绘图可能会非常不准确地放置线条 例如 请参阅附图中左端点的位置 至少有一整像素的空气是不应该存在的 事实上 我认为线中心偏离了 2 个像素 如何让matplotlib绘图准确 我不介意性能是否会受到影响 m
  • 通过成员数据在向量中搜索结构体项

    我对 C 非常陌生 我正在尝试找到一种方法来搜索结构向量以查找具有特定成员数据的结构 我知道这适用于向量中的简单类型 std find vector begin vector end item vector end 但假设我有一个这样的结构
  • 使用 JavaScript 更改标签文本

    为什么以下内容对我不起作用
  • Angular2 中的更改不会更新视图

    我已经开始探索 Angular2 我带着 Angular1 和一些 React 背景而来 但我遇到了一个问题 我想将某些击键绑定到组件中的操作 因此我决定使用 Angular2 生命周期来绑定 取消绑定操作 但是 如果我在 Mousetra