角度 2(更改)事件未触发

Posted

技术标签:

【中文标题】角度 2(更改)事件未触发【英文标题】:angular 2 (change) event not firing 【发布时间】:2017-10-08 14:20:00 【问题描述】:

我的组件中有以下功能:

onProductSelect(e)
        var attrs = document.getElementById('firstAttr');        
        return this.groupComponentSvs.getProduct(e.target.value)
                      .subscribe(
                            selectProduct=>                                
                                this.selectProduct=selectProduct; 
                                var select = "<select class='form-control' id='"+ selectProduct.attribute +"' (change)='selectNextAttr($event)' name='selectProd'>";
                                console.log(select);
                                    select+= '<option value="0">Select</option>';
                                for (var i=0; i<selectProduct.values.length; i++)  
                                    select+= '<option value='+ selectProduct.values[i]+ '>'+ selectProduct.values[i] +'</option>';
                                  
                                select+='</select>' ;                                
                                attrs.innerhtml = '<div id=attr_'+ selectProduct.attribute +'>'+ select +'</div>';                              
                                error=>this.errorMessage = <any>error
                                                        
                )                 

    

selectNextAttr(attr, val)
 console.log("this is a test");

我可以在我的 html 页面中插入选择菜单,但我选择一个项目时不会触发更改事件。有人可以告诉我为什么会这样吗?

谢谢

【问题讨论】:

请分享您的 HTML 代码 是的,肯定 Angular 2 中的 (change) 事件存在问题。如果您仔细注意,它的工作方式与 (blur) 相同。是的,您可以使用 (ngModelChange),只要有就会触发用户输入的一些变化 【参考方案1】:

您应该使用 ngModelChange 而不是 change

 "<select class='form-control' id='"+ selectProduct.attribute +"' (ngModelChange)='selectNextAttr($event)' name='selectProd'>"

【讨论】:

【参考方案2】:

检查这个答案:https://***.com/a/33716321/2114024

试试:

<select [ngModel]='selectedProduct' 
        class='form-control' 
        [id]='"+ selectProduct.attribute +"' 
        (ngModelChange)='selectNextAttr($event)' name='selectProd'>

【讨论】:

感谢您回复我,但似乎仍然无法正常工作。如果我执行以下操作,但我需要使用 ts 动态添加它: HTML 代码: TS:onProductSelect(e) //var attrs = document.getElementById('firstAttr'); return this.groupComponentSvs.getProduct(e.target.value) .subscribe(selectProduct=> this.selectProduct=selectProduct; error=>this.errorMessage = error ) 【参考方案3】:

使用[innerHTML]="..." 添加的HTML由 Angular 以任何方式处理,并且不会为此类 HTML 创建绑定、组件、指令。 Angular 对此类 HTML 所做的唯一事情就是出于安全目的进行清理。

因此,您不能使用[ngModel]="..."(ngModelChange)="..."

处理此类需求的一种方法是在运行时动态创建组件,并将创建的 HTML 用作此类组件的模板。 请参阅 Equivalent of $compile in Angular 2 了解如何做到这一点。

【讨论】:

【参考方案4】:

你的方法:

selectNextAttr(attr, val) 
  console.log("this is a test");

这需要 2 个参数,而在使用中您只传递了一个:

var select = "<select class='form-control' id='"+ selectProduct.attribute +"' (change)='selectNextAttr($event)' name='selectProd'>";

如果您只想获取所选项目的值,请更改方法签名,如下所示。

selectNextAttr(event) 
  // this will give the selected item value.
  console.log("this is a test", event.target.value);

【讨论】:

以上是关于角度 2(更改)事件未触发的主要内容,如果未能解决你的问题,请参考以下文章

模糊事件未在角度分量上触发

ngmodel 更改时未触发角度日期过滤器

更新角度范围而不触发更改事件

当从输入框中删除最后一个字符时,事件未在剑道网格和角度 5 中触发?

Backbone.js 更改事件未触发

输入未触发更改事件