【问题标题】:Angular 4 trigger event for dynamic checkbox动态复选框的Angular 4触发事件
【发布时间】:2018-04-26 20:15:54
【问题描述】:

我创建了一个 div 元素和动态复选框以及更改功能。但是在单击复选框时,不会调用该函数

我的代码

@Component({
    selector: 'Dropdown',
    template: `<div class="select">
        <div class="selectBox" (change)="Checkboxes()">
          <select multiple>
            <option id='Option' (click)='Click()'>Select an option</option>
          </select>
        </div>
        <div id="checkboxesdiv">
      </div></div>`
})

ngOnInit 我已经声明了具有动态值的字符串并分配给模板的 innerHtml

    let option = "";
    for(let item of DBdata){
    option += "<label for='" + item.id+ "' title='" + item.des+ "'><input class='Optioninputclass' (change)='ChangeFn()' type='checkbox' id = '" + item.id+ "'/>" + item.des+ "</label>"
    }

    var select = document.getElementById("checkboxesdiv");
    select.innerHTML = this.optionValue;

在单击复选框时未调用 ChangeFn。我也尝试过(click)='ChangeFn()',但结果相同。提前致谢。

【问题讨论】:

  • 什么是ChangeFn?你的Checkboxes() 函数在哪里?您希望(change) 位做什么?
  • DOM 操作正是 Angular 所不鼓励的。更重要的是,如果你必须使用 DOM,比如 jQuery,那么 ngAfterViewInit 就是事件。
  • Checkboxes() 将样式显示块分配给标签元素

标签: javascript angular for-loop


【解决方案1】:

Angular 模板是在构建过程中编译的。当您通过 innerHTML 动态设置内容时,您不能使用角度语法(或者可以,但它只是被忽略)。您应该做的是使用 *ngFor 在模板中创建检查框。

@Component({
    selector: 'Dropdown',
    template: `<div class="select">
        <div class="selectBox" (change)="Checkboxes()">
        <select multiple>
            <option id='Option' (click)='Click()'>Select an option</option>
        </select>
        </div>
        <div id="checkboxesdiv">
            <label [for]="item.id" [title]="item.des" *ngFor="let item of DBdata">
                <input class="Optioninputclass" (change)="ChangeFn()" type="checkbox" [id]="item.id"/>{{ item.des }} 
            </label>
        </div>
    </div>`
})

只需确保 DBdata 是组件中的公共字段,以便模板可以访问它。

【讨论】:

  • DBData 不需要公开,私有变量/数组/对象也可以工作
  • 如果您使用 AOT 编译,它们将不起作用。在这种情况下,您在模板中访问的所有内容都需要公开。
  • 不正确,如果您希望其他类/组件读取值,它们只需要公开。 private 表示只有该组件和相应的 html 文件才能访问它
  • 这里有一些关于该主题的进一步阅读:stackoverflow.com/questions/48387145/…
  • 你错了。请阅读我提供的链接。当您使用 AOT 构建时(当您在 prod 模式下构建时,angular 会这样做),模板被编译成类,因此该字段需要公开才能被模板访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多