当前位置: 首页 > 知识库问答 >
问题:

当组件加载到下拉列表中时,为什么ngmodelChange事件不触发?

池兴邦
2023-03-14

在Angular 8组件中,我向下拉控件添加了双向绑定。

视图

<select  (ngModelChange)='termSelectChanged($event)' [ngModel]="selected">
  <option [ngValue]="t" *ngFor='let t of termsColl'>{{t?.code}}</option>
</select>

组件代码

export class AppComponent implements OnInit{


     public termsColl : Array<DDModel>;
     public selected : DDModel;
     
      constructor( private s : DDService ){}
      
    termSelectChanged( event  ){    
            alert('HIT');
    }
    
    
      ngOnInit(){
        
        //service call #1
        this.s.getDataForComplexBind().subscribe(  data => {
          this.termsColl = data;
         
        }, error => error );    


        //service call #2
        this.s.getOtherData(  ).subscribe( data => {
          
          //model changes here
          this.selected = this.termsColl[1];
          
        }, error => {  console.error(error);  });

                    
    }

} 

加载组件时,它会执行ngonit(),并使用数组的第一个元素设置所选的模型绑定属性<代码>termsColl有数据,但行<代码>此。已选择=此。termsColl【1】 不会将选定选项更改为下拉列表中的第一个元素。事实上,当组件加载时,我希望它触发事件ngModelChange,但它也没有触发事件。我在代码中添加了一个警报(),但在加载组件时没有显示。仅当我从下拉列表中选择一个选项时,它才会显示。如何更改代码,以便在加载组件时执行ngModelChange事件?

这是我的stackblitzhttps://stackblitz.com/edit/angular-version-yeg27j?file=src/app/app.component.ts

共有3个答案

公羊兴文
2023-03-14

您可以在选项元素中使用值而不是值。并将t.code而不是t指定给属性。

<select  (ngModelChange)='termSelectChanged($event)' [ngModel]="selected">
  <option [value]="t.code" *ngFor='let t of termsColl'>{{t?.code}}</option>
</select>

参考号:https://angular-version-xkjuff.stackblitz.io

黄博艺
2023-03-14

如果要触发ngModelChange,可以使用ngModel的ViewTomodeUpdate()更新值。你可以在这里找到更多信息。

但您需要做以下更改。

在html模板中:

<select  (ngModelChange)='termSelectChanged($event)' [ngModel]="selected" #ngModel="ngModel">
  <option [value]="t" *ngFor='let t of termsColl'>{{t?.code}}</option>
</select>

您可以看到,我正在模板中添加对ngModel的引用,我将在component类中使用它。

在组件类中:

export class AppComponent {
  name = "Angular 6";
  version = VERSION.full;

  public termsColl: Array<DDModel>;
  public selected: string;

  @ViewChild("ngModel") ngModel: NgModel;

  constructor(private s: DDService) {}

  termSelectChanged(event) {
    this.selected = event;
  }

  ngOnInit() {
    this.s.getOtherData().subscribe(
      data => {
        this.termsColl = data;
        this.ngModel.viewToModelUpdate(this.termsColl[1]);
      },
      error => {
        console.error(error);
      }
    );
  }
}

您可以看到,我正在使用ngModel引用调用值来更新视图,这反过来会触发ngModelChange。

由于您没有直接使用双向绑定,因此必须将该值设置为触发器函数中的选定变量。

希望这能帮助您达到您的要求。

杜曜灿
2023-03-14

我将ngModeChange输入更改为DDModel并从订阅内部调用您的termSelectChanged()。我还将[ngModel]更改为[(ngModel)]

<select  (ngModelChange)='termSelectChanged($event)' [(ngModel)]="selected">
  <option [ngValue]="t" *ngFor='let t of termsColl'>{{t?.code}}</option>
</select>
  termSelectChanged(selection: DDModel) {
    console.log("HIT", selection);
  }

  ngOnInit() {
    this.s.getOtherData().subscribe(
      data => {
        this.termsColl = data;
        this.selected = this.termsColl[0];
        this.termSelectChanged(this.selected);
      },
      error => {
        console.error(error);
      }
    );
  }

我不能告诉你为什么从代码中更改this.selected不会触发ngModelChange。也许是因为模板中调用了ngModelChange

 类似资料:
  • 假设用户从下拉列表中选择option2,那么f1()将在下拉列表的值发生更改时执行,我正在监听更改事件。现在,用户再次单击下拉列表并选择option2,在这种情况下,下拉列表的值不变,因此f1不会执行。现在,我希望每次用户从下拉列表中选择某个值时都执行f1,无论值是否更改。

  • 我在使用Discord。js创建一个基本的Discord机器人。当bot第一次启动时,我运行获取机器人当前订阅的所有协会的列表。我将其保存到其他程序使用的数据库中。 然而,当人们从他们的公会中添加/删除机器人时,我想保留一个更新的公会列表。我意识到我可以每分钟重新运行,但这似乎效率低下。 当你的机器人被添加到公会和/或频道时,是否有触发的事件?据我所知,事件似乎针对所有已经订阅该公会的用户/机器人

  • 在JavaScript中,我按住两个键,并且被完美触发。当我释放其中一个键时,被触发。到目前为止一切都很好。但是我仍然按住一个键,那么为什么没有被触发呢?我需要在我的游戏中发生这种情况。我做错了什么吗?这是预期的反应吗?有什么解决办法吗?

  • 问题内容: 我的MVC视图中的代码为黑色,如下所示: 我想设置ViewData [“ selected”]的值,以便可以将其发送到所需的操作。有人可以建议我该怎么做吗? 谢谢! 问题答案: 为什么不使用表单,而不在下拉菜单中使用jQuery onChange事件?

  • 问题内容: 我正在尝试在客户端动态生成文件时在客户端上显示“掩码”。似乎为此的推荐解决方法(因为它不是ajax)是使用iframe并从onload或done事件中侦听以确定文件从服务器实际发送到客户端的时间。 这是我的角度代码: 这在Firefox中效果很好,但在Chrome中没有运气。我也尝试过使用onload函数: 但是我那里也没有运气。 有想法吗? 问题答案: 不幸的是,如果内容是附件,则无