扩展Angular 2 ngModel指令以使用observable

nwa*_*arp 20 observable rxjs angular

Angular 2 ngModel指令适用于变量和函数

<input [ngModel]="myVar" (ngModelChange)="myFunc($event)" />

而不是变量和函数,我想使用BehaviorSubjects

<input [ngModel]="mySubject | async" (ngModelChange)="mySubject.next($event)" />

有没有一种安全的方法来扩展ngModel或使用某种宏来减少模板中的重复?

<input [myNewNgModel]="mySubject" />

Lui*_*yfe 7

我想出了一个与@Adbel类似的方法。不确定这的内在含义,但如果能得到一些反馈那就太好了。Stackbliz 代码

你的.component.ts

export class AppComponent  {
  email = new BehaviorSubject("UnwrappedMe ");

  emailHandler(input) {
    this.email.next(input);
  }
}
Run Code Online (Sandbox Code Playgroud)

Your.component.html

 <form class="mx-3">
     <input [ngModel]="email | async" 
            (ngModelChange)="emailHandler($event)" 
            name="email" type="email" 
            id="email" placeholder="Enter email">
 </form>

 <p class="mx-3"> {{ email | async }} </p>
Run Code Online (Sandbox Code Playgroud)

如果您需要获取对输入值的引用并且不想进行第二次订阅(使用模板变量),则有一点变化。

Your.component.html

 <form class="mx-3">
     <input [ngModel]="email | async" #emailref
            (ngModelChange)="emailHandler($event)" 
            name="email" type="email" 
            id="email" placeholder="Enter email">
 </form>

 <p class="mx-3"> {{ emailref.value }} </p>
Run Code Online (Sandbox Code Playgroud)


rea*_*pie 4

我不知道你为什么不只使用反应形式,但这是一个有趣的谜题。我创建了一个指令,将模型值更改为 的BehaviorSubject值。任何更改都会为您.next调用BehaviorSubject

用法将如下所示

<input type="text" [ngModel]="ngModelValue" appRxModel> 
Run Code Online (Sandbox Code Playgroud)

这是stackblitz,享受吧

  • 不链接到外部资源;相反,在这里解释如何解决问题 (6认同)