【问题标题】:How do I bind a checkbox to a select disabled property using ngx data binding?如何使用 ngx 数据绑定将复选框绑定到选择禁用的属性?
【发布时间】:2018-11-13 20:46:15
【问题描述】:

我正在构建一个 Angular 6 应用程序,我想将 select 的显示/隐藏逻辑绑定到复选框 input。我不确定我的问题在哪里。我想我需要一个可观察的,但我想知道是否有办法直接做到这一点(直接就像在我的打字稿代码中不使用变量一样)。

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

@Component({
    selector: 'hello',
    template: `<label><input #bl id="checkBox" type="checkbox"> ere</label>
      <br/>
      <span>{{bl.checked}}</span>
      <br/>
      <select id="bl_select" class="select" *ngIf="(bl.checked)">
        <option value="0">All</option>
        <option value="1">Else</option>
      </select>`,
  styles: []
})
export class HelloComponent  {
}

您可以在stackblitz.com 上找到MCVE

How do I bind a checkbox to a select disabled property using angular data binding? 相关,但与 ngx 相关。

在我的 wpf 时代,这是数据绑定的常见用途 :)

【问题讨论】:

  • @ConnorsFan 它正在工作,但不是直接工作。我们依赖于一个外部变量。可以直接绑定吗?
  • 我不这么认为。正如您在 stackblitz 中看到的,如果没有 Angular 数据绑定或事件绑定,就不会执行更改检测。

标签: javascript angular data-binding web-component


【解决方案1】:

这似乎做你想做的事(见this stackblitz):

<input #bb type="checkbox" [(ngModel)]="bb.checked">
<select class="select" [hidden]="!bb.checked">

它也适用于添加到输入元素的临时属性(例如showSelect)。只要在复选框上设置了数据绑定,就会更新视图(参见this stackblitz)。

<input #bb type="checkbox" [(ngModel)]="bb.showSelect">
<select class="select" [hidden]="!bb.checked">

话虽如此,绑定到组件类中定义的模型更符合 Angular 的做事方式:

<input type="checkbox" [(ngModel)]="showSelect">
<select class="select" [hidden]="!showSelect">
export class HelloComponent {
  showSelect= false;
}

【讨论】:

  • 不错!知道了! (是的,我在工作中使用反应式或模板形式)
【解决方案2】:

可能有点过头了,

export class HelloComponent {
    public flag = false;
}

如果你在组件中定义了这个变量,那么在你的模板中你可以这样做

<select *ngIf="flag">

【讨论】:

  • 你能分享一个演示吗?我只是尝试它,它不起作用。不,我错过了什么。
  • @windmaomao - 您应该将[(ngModel)]="flag" 添加到复选框元素中。
  • @ConnorsFan 也不起作用。你能分享一个工作演示吗?
  • @windmaomao - 是的,但是flag 是如何修改的?
  • @windmaomao - 他想根据复选框的状态显示/隐藏select 元素。这就是为什么我建议将flag 绑定到复选框。
【解决方案3】:

好的,我相当找到了。 Demo on stackblitz:

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

@Component({
  selector: 'hello',
  template: `<label><input #bb type="checkbox" [(ngModel)]="this.flag">Show select</label>
      <span>({{this.flag}})</span>
      <select class="select" [hidden]="!this.flag">
        <option value="0">All</option>
        <option value="1">Else</option>
      </select>`,
  styles: []
})
export class HelloComponent  {
}

顺便说一句,如果您想知道ngIf*[hidden] 之间的区别是什么。当表达式为假时:

  • *ngIf 从 DOM 中删除元素。
  • [hidden] 对用户隐藏元素。

编辑:正如@ConnorsFan 所说,这与@windmaomao 和他自己讨论的解决方案完全相同。 this.flag 将创建 flag 属性。

【讨论】:

  • 这与我在this stackblitz 中展示的解决方案相同。您的代码实际上在组件类中创建了一个未声明的 checked 标志。您可以通过删除我的代码中的flag 声明来查看它;该代码仍然适用于[(ngModel)]="flag"。换句话说,您代码中的this.checked 不是指checkbox 元素的checked 属性,而是指组件类的属性。
猜你喜欢
  • 1970-01-01
  • 2012-04-19
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多