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

Mat*_*ers 18 data-binding typescript angular

我知道如何使用不同的名称来修复我的组件,以获取此组件的输出值.

让我分享我的代码

从'@ 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

所以这是一个非常基本的组件,它将两个字符串验证为"有效"的荷兰移动号码,所以可以说是一个确认框.现在,我可以通过执行类似的操作来获取父组件中的值

(mobile)="myParam = $event"
Run Code Online (Sandbox Code Playgroud)

我想要的是像它一样使用它

[(mobile)]="myParam"
Run Code Online (Sandbox Code Playgroud)

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

Gün*_*uer 33

要使这种紧凑的语法工作,输入和输出需要遵循特定的命名规则

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

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

  @Output() mobileChange: EventEmitter<string> = new EventEmitter<string>();
  @Input() set mobile(value) {
    this.msisdn_confirm = this.msisdn = value;
  }
Run Code Online (Sandbox Code Playgroud)

  • 接近https://angular.io/docs/ts/latest/guide/template-syntax.html#!#two-way的部分末尾 (3认同)
  • 因此,最好将这些东西放在堆栈溢出上,无论如何它都是我的主要文档来源。 (2认同)
  • 更新了angular.io doc部分的链接:https://angular.io/guide/template-syntax#two-way-binding--- (2认同)
  • 更新了 angular.io 文档部分的更新链接:https://angular.io/guide/two-way-binding (2认同)

dav*_*aus 8

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

export class TaskBook {
  public taskBookID: number;
  public title: String; 
}
Run Code Online (Sandbox Code Playgroud)

内部组件代码:

   ....
    <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);
      }  
    }
Run Code Online (Sandbox Code Playgroud)

外部调用组件:

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

 public taskbookObj: TaskBook;
Run Code Online (Sandbox Code Playgroud)

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