【问题标题】:in angular, how to get select/ ngModel previous value after change event fire在角度中,如何在更改事件触发后获取 select/ngModel 以前的值
【发布时间】:2018-10-08 23:26:36
【问题描述】:

我正在使用 Angular 2 表单,并且在模板中具有下拉/选择,其数据与 ngModel 和 onChnage 事件绑定。我需要检测 ngModel 的先前值吗?我尝试过使用 data-* 属性 https://www.w3schools.com/tags/att_global_data.asp 将当前值存储在其中,希望它不会随 ngModel 值而改变,然后在事件触发时发回,但在传递更改时获取 NaN 值。

下拉/选择初始值是从数组即question[]映射的,当前defaultValue在“question.value”中

模板

<div *ngSwitchCase="'dropdown'"> <small>dropdown</small>
           <div class="form-group">
                {{question.value}}
               <select [id]="question.key" 
                       [formControlName]="question.key" 
                       [(ngModel)]="question.value"  
                       data-default-element="question.value"     
                       (change)="onChangeValue($event, responseId, question.key, data-default-element , 'dropdown')" 
                       (blur)="onChangeValue($event, responseId, question.key, data-default-element , 'dropdown')"
                       >

                   <option *ngFor="let opt of question.options" 
                           [value]="opt.key" >{{opt.value}} </option>
               </select>
           </div>            
       </div>  

组件

onChangeValue(event: any, givenResponseId:string, givenQuestionId:string, defaultValue:string, givenInputType:string) { 

    var givenAnswer = null;

    console.log("defaultValue  ",defaultValue);

    if(event.target.value !="")
    {
       givenAnswer = event.target.value;
       console.log("newValue  ",givenAnswer );
    }

 }

【问题讨论】:

  • 我建议您在使用响应式表单时不要使用 ngModel,除非您想实时更新某些内容。此外,您将data-default-element(不是作为字符串)传递给您的更改方法。改为传递question.value,并删除ngModel,那么您有以前的/默认值吗?
  • 那么我的问题来自最初来自数据库的数据绑定和验证????

标签: angular typescript


【解决方案1】:

您必须考虑使用来自“@angular/core”的 OnChanges。有了这个,您可以获得当前值和以前的值。这是一个例子。请注意,它仅适用于 Input 类型的属性

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

@Component({
 selector: 'app-your-selector',
 templateUrl: './template-path.html',
 styleUrls: ['./style-path.css']
})
export class myComponent implements OnChanges{

 @Input() myAttribute : string;//This should be your ngModel attribute

 ngOnChanges(changes : SimpleChanges ){
   if(changes["myAttribute"]){
    let currentValue = changes["myAttribute"].currentValue;
    let previousValue = changes["myAttribute"].previousValue;
   }
  }
}

【讨论】:

  • 我的表单是动态生成的,这可能并不完全适用,但我想我知道接下来我可以尝试什么!...谢谢.. +1
【解决方案2】:

如果您从表单中删除 ngModel,并将 question.value 而不是 data-default-element 传递给您的更改方法,您将获得以前的值。然后,您可以在您的更改方法中更新question.value,以便根据需要使用给定的答案更新它。 ngModel 将双向绑定数据,当用户在表单中输入内容时更新您的 question.value。

【讨论】:

  • 那么我的问题来自最初来自数据库的数据绑定和验证????
  • 您必须将数据库中的值作为FormControl 中的状态传递。例如,question.key = new FormControl(stateFromDatabase,[]); 如果您从创建 FormGroup 和 FormController 的控制器中添加代码,也许我可以提供更多帮助
  • 我有表单组,我正在绑定数组中的数据并计算其类型,即收音机、文本框、选择
  • 你能添加一些关于如何构建表单的代码吗?我猜我的答案有效,但是现在您无法将数据库中的值绑定到表单,对吗?
猜你喜欢
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2017-05-09
  • 2018-09-04
  • 1970-01-01
  • 2017-10-08
  • 2018-06-07
相关资源
最近更新 更多