Angular2 2方式绑定中同名的自定义输入和输出

Posted

技术标签:

【中文标题】Angular2 2方式绑定中同名的自定义输入和输出【英文标题】:Custom input and output on same name in Angular2 2 way binding 【发布时间】:2016-10-17 17:26:03 【问题描述】:

我知道如何修复我的组件,为此组件的输出值使用不同的名称。

让我分享我的代码

从 '@angular/core' 导入 Component, Input, Output, EventEmitter; 从“../pipes/translation.pipe”导入TranslationPipe;

@Component(
  selector: 'msisdn-confirm',
  template: `
  <div class="msisdn-confirm">
    <div>
      <input type="text" [(ngModel)]="m1">
    </div>
    <div>
      <input type="text" [(ngModel)]="m2">
    </div>
    <p class="error">message</p>
  </div>
`
)
export class MsisdnConfirm 
  message:string;
  @Output('mobile') emitter: EventEmitter<string> = new EventEmitter<string>();
  @Input('mobile') set setMobileValue(value) 
    this.msisdn_confirm = this.msisdn = value;
  

  set m1(value) 
    this.msisdn = value;
    if (this.valid()) 
      console.log('emit' + this.msisdn);
      this.emitter.emit(this.msisdn);
    
  

  set m2(value) 
    this.msisdn_confirm = value;
    if (this.valid()) 
      console.log('emit' + this.msisdn);
      this.emitter.emit(this.msisdn);
    
  

  get m1():string 
    return this.msisdn;
  
  get m2():string 
    return this.msisdn_confirm
  

  msisdn: string;
  msisdn_confirm: string;

  constructor() 

  

  private valid(): boolean 
    if (!/06[0-9]8/.test(this.msisdn)) 
      this.message = new TranslationPipe().transform("Het mobiele nummer is incorrect, (bijvoorbeeld: 0612345678)")
      return false;
     else if (this.msisdn != this.msisdn_confirm) 
      this.message = new TranslationPipe().transform("De mobiele nummers komen niet overeen")
      return false;
    
    this.message = null;
    return true;
  

所以这是一个非常基本的组件,它验证两个字符串是一个“有效的”荷兰手机号码,所以可以说是一个确认框。现在我可以通过做类似的事情在父组件中获得我的价值

(mobile)="myParam = $event"

我想要的是像这样使用它

[(mobile)]="myParam"

这仅适用于设置,自定义组件不支持吗?

【问题讨论】:

【参考方案1】:

要使这种紧凑的语法起作用,输入和输出需要遵循specific naming rules

[(mobile)]="myParam"
  @Output('mobileChange') emitter: EventEmitter<string> = new EventEmitter<string>();
  @Input('mobile') set setMobileValue(value) 
    this.msisdn_confirm = this.msisdn = value;
  

不鼓励通过将字符串参数传递给装饰器来重命名输入和输出。而是使用

  @Output() mobileChange: EventEmitter<string> = new EventEmitter<string>();
  @Input() set mobile(value) 
    this.msisdn_confirm = this.msisdn = value;
  

【讨论】:

因此最好将这些东西放在堆栈溢出上,无论如何它是我的主要文档来源。 接近部分angular.io/docs/ts/latest/guide/template-syntax.html#!#two-way的末尾 感谢您的快速回复! 更新了 angular.io 文档部分的链接:angular.io/guide/template-syntax#two-way-binding--- 更新了 angular.io 文档部分的更新链接:angular.io/guide/two-way-binding【参考方案2】:

上面 Gunter 代码的另一个示例可能会有所帮助:

export class TaskBook 
  public taskBookID: number;
  public title: String; 

内部组件代码:

   ....
    <input type="text"  pInputText [(ngModel)]="data!.title" (change)="onDataChange()" />
   ....

 @Component(
  selector: 'taskbook_edit',
  templateUrl: './taskbook_edit.component.html' 
)
    export class TaskbookEditComponent  

      @Input() data: TaskBook;
      @Output() dataChange = new EventEmitter<TaskBook>();

      constructor()   

      onDataChange()  
        this.dataChange.emit(this.data);
        
    

调用组件外:

<taskbook_edit  [(data)]="taskbookObj" ></taskbook_edit>

 public taskbookObj: TaskBook;

【讨论】:

Günter 的回答是重用 OP 的代码,但我认为对于仍然不太熟悉 Angular 语法的某些部分的其他人来说,你的回答更清楚。感谢您提供此示例! 这是我的意图 :) 感谢您的评论。

以上是关于Angular2 2方式绑定中同名的自定义输入和输出的主要内容,如果未能解决你的问题,请参考以下文章

自定义 angular2 表单输入组件,在组件内具有两种方式绑定和验证

Angular 2 自定义表单输入

Angular 2 - 单元测试绑定到嵌套的自定义表单控件

Angular2 Material:Angular 材质输入的自定义验证

angular 2+ 中的自定义输入类型

组件输入属性上的双向数据绑定