javascript - Angular 6 正确初始化自定义输入组件

标签 javascript angular typescript angular5 angular6

我试图用 debounce 创建一个自定义输入组件,所以我遵循了 this suggestion

Debounce 有效,但在开始时输入值未正确设置到输入组件。

我是这样实现的:

app.component.ts

import { Component } from '@angular/core';
import { DebInputComponent } from './deb-input/deb-input.component';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
  test:string ='test';
}

app.component.html

  <deb-input [(ngModel)]="test" type="text" label="Test" ngDefaultControl>
  </deb-input>
<div>{{test}}</div>

deb-input.component.ts

import { Observable, Subject } from 'rxjs';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
import { Component, Input }   from '@angular/core';

@Component({
  selector: 'deb-input',
  templateUrl: './deb-input.component.html',
  styleUrls: ['./deb-input.component.css'],
  providers: []
})

export class DebInputComponent {
    @Input() label: string;
    @Input() type: string="text";
    @Input() model: string;
    modelChanged: Subject<string> = new Subject<string>();

    constructor() {
     this.modelChanged
      .pipe(debounceTime(1000))
      .pipe(distinctUntilChanged())
      .subscribe(newValue => {this.model = newValue;
        console.log(this.model)});
    }

    changed(text: string) {
        this.modelChanged.next(text);
    }
}

deb-input.component.html

 <div>
 <span>{{label}}</span>
 <input [(ngModel)]='model' (ngModelChange)='changed($event)' [type]='type' ngDefaultControl/>
</div>

如何确保 deb-input 中的 model 正确设置为“test”?

最佳答案

您正在使用 ngmodel 而您应该使用组件输入的名称

<deb-input [model]="test" type="text" label="Test" ngDefaultControl>
  </deb-input>

编辑

如果你想为你的组件进行双向绑定(bind),只需将 eventEmitter 添加到你的组件中,如下所示:

@Input() model: string;
@Output() modelChange = new EventEmitter<string>();
modelChanged: Subject<string> = new Subject<string>();
@Output() modelChangeEvt = new EventEmitter<string>();

 constructor() {
 this.modelChanged
  .pipe(debounceTime(1000))
  .pipe(distinctUntilChanged())
  .subscribe(newValue => {this.model = newValue;
    this.modelChangeEvt.emit(newValue);
    console.log(this.model)});
}

然后在 HTML 中使用 2 方式绑定(bind):

<deb-input [(model)]="test" type="text" label="Test" ngDefaultControl></deb-input>

关于javascript - Angular 6 正确初始化自定义输入组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50929043/

相关文章:

javascript - HTML 表单要求规范

javascript - Mocha 测试套件在 setInterval(...) 运行时永远不会结束

javascript - 调用 axios 时出现 typescript 错误 - 没有重载匹配此调用

typescript - 在 TypeScript 中使用 jQuery 插件

typescript - 想要强制一个特定类型的函数,但想要在 TypeScript 中有一个默认值

javascript - 将数据库中的数据导入到JS文件中

javascript - 通过 jQuery slider/Backbone 动态更新字段

angular - RxJS - 只订阅一次但不完成 Observable

Angular 4 : View is not updating after model change?

angular - ag-grid cellRenderer 在值评估后渲染单元格失败