【问题标题】:Angular 2 get element by dynamic idAngular 2通过动态ID获取元素
【发布时间】:2017-12-08 11:59:42
【问题描述】:

如何获取/更新具有动态 id 的元素的值?

<input type="text" class="form-control" id="{{'lat' + ind}}" formControlName="lat">

我不能使用ngAfterViewInit() {},因为我需要在服务器响应后更新动态输入

this.someService.getData().subscribe(
                  (response) => {this.data = response.json()
                                 this.lon = this.data.x;
                                 this.lat = this.data.y;
                                 this.ind = this.data.ind;
                                // UPDATE MY 'lat+ind' and 'lon+ind' HERE
                  },
                  (error) => console.log('ERROR: ' + error)
          ); 

【问题讨论】:

  • 您可以使用document.querySelector('#lat' + this.ind) 来检索 DOM 元素
  • 以及如何获取价值和更新?

标签: angular patch


【解决方案1】:
this.someService.getData().subscribe(
    (response) => {
                     this.ngZone.run(function() {
                       this.data = response.json()
                       this.lon = this.data.x;
                       this.lat = this.data.y;
                       this.ind = this.data.ind;
                     };)
                  },
(error) => console.log('ERROR: ' + error)
);  

注意:你必须导入 NgZone 并在你的构造函数中注入它。

您需要这样做,因为在您收到服务的响应后,您的视图并未更新。我上面的代码将恢复您的视图并将更新的值发布到您的 ID。

当您的 lat 和 ind 仍未定义时,您的模板会在开始时发布。然后,当您拨打服务电话并收到响应时,您必须告诉 Angular 使用新值更新您的视图。

注意:您也可以使用 ChangeDetectorRef.detectChanges() 来执行此操作

【讨论】:

  • 我认为他想检索输入元素 - 它具有动态 ID。
  • 他不需要检索输入元素。 Angular 会自动使用新的 lat 和 ind 值更新输入元素
  • 哦,我可能误解了这个问题,我的错。虽然我认为.run() 不会改变任何东西,因为它用于重新进入 Angular 区域,但我看不到.runOutsideAngular() 的任何用法。
  • "区域包装异步浏览器 API,并在异步任务开始或结束时通知使用者。Angular 利用这些 API 在任何异步任务完成时获得通知。这包括 XHR 调用之类的事情, setTimeout() 和几乎所有的用户事件,如点击、提交、鼠标按下等。一旦收到通知,Angular 就知道它必须执行更改检测,因为任何异步操作都可能改变了应用程序状态。例如,当我们使用 Angular 的 Http 服务从远程服务器获取数据时,情况总是如此。”
【解决方案2】:

对于 Angular 可能有更好的解决方案,但您可以使用 querySelector

这是一个例子:

const input = <HTMLInputElement>document.querySelector('#lat' + this.ind);

input.value = 'value'; // set value

编辑

请阅读 https://angular.io/guide/forms 以了解表单如何与 Angular 配合使用。

【讨论】:

  • 谢谢,但我的问题是输入得到了新值,但是 form.data 对象编号:“addresses”:[ {“lat”:0,“lon”:0 },{“lat”: 0, "lon": 0 } ]
  • @Serhiog.Lazin 据我所知,您没有设置任何输入值。您正在设置 id。查看我的编辑。
  • 您的答案有效。新值出现在输入中,但没有出现在 form.value 对象中。这是个问题
  • 表单没有名为value 的属性,只有输入有(参见stackoverflow.com/questions/3547035/…)。
猜你喜欢
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2012-07-20
  • 2011-07-17
  • 2013-07-27
相关资源
最近更新 更多