当第一次完成时,角2会发出第二个发射

当第一次完成时,角2会发出第二个发射

问题描述:

我们已经开始从ng1迁移到ng2,但我不明白如何升级我的按钮组件。例如: 在角度1,I可以通过一个承诺的部件的内部,并等待响应,例如:当第一次完成时,角2会发出第二个发射

class ButtonController { 
    click:() => Promise<any>; 
    form: SomeForm; 

    onClick(): void { 
     this.click().then(() => { 
     this.form.doSomething(); 
     }); 
    } 
} 

export const ButtonComponent = { 
    templateUrl: 'button-component.template.html', 
    controller: ButtonController, 
    controllerAs: 'vm', 
    require: '^form', 
    bindings: { 
     click: '&' 
    } 
}); 

但是,我怎样才能实现这一目标在角2 @Output和EventEmitter?我用@Input来实现这一点,从组件和ButtonComponent和FormComponent之间的服务的回调,但我相信这是完全错误的。会很高兴有任何帮助。谢谢。

角2代码:

登录up.template.html

// content 
<ab-form [uFormGroup]="signUpForm"> 
    //content 
    <ab-button [uClick]="onClick"></ab-button> 
</ab-form> 

登录up.component.ts

export class SignUpComponent { 
    onClick =() => { 
     //do something async 
    } 
} 

form.component.ts

@Component({ 
    selector: "ab-form", 
    template: require("./form.template.html"), 
    providers: [ 
     FormService 
    ] 
}) 
export class FormComponent { 
    @Input() uFormGroup: FormGroup; 

    constructor(
     private formService: FormService 
    ) { 
     this.formService.buttonClicked$.subscribe((fn) => { 
     this.uFormGroup['submitted'] = true; 

     if (this.uFormGroup.invlaid) { 
      return this.formService.endSubmittingForm(); 
     } 

     this.formService.startSubmittingForm(); 
     // resolve if function is not a promise 
     Promise.resolve(fn()).then(() => { 
      this.formService.endSubmittingForm(); 
     }); 
     }); 
    } 
} 

button.component.ts

export class ButtonComponent { 
    submitting = false; 

    constructor(
     private formService: FormService 
    ) { 
     this.formService.formSubmitting$.subscribe(() => { 
     this.submitting = true; 
     }); 

     this.formService.formSubmitted$.subscribe(() => { 
     this.submitting = false; 
     }); 
    } 

    onClick(): void { 
     this.formService.buttonClick(this.uClick); 
    } 
} 

form.service.ts

export class FormService { 
    private buttonClickedSource = new Subject<Function>(); 
    private formSubmittingSource = new Subject<void>(); 
    private formSubmitedSource = new Subject<void>(); 

    buttonClicked$ = this.buttonClickedSource.asObservable(); 
    formSubmitting$ = this.formSubmittingSource.asObservable(); 
    formSubmited$ = this.formSubmitedSource.asObservable(); 

    buttonClick(fn: Function): void { 
     this.buttonClickedSource.next(fn); 
    } 

    startSubmittingForm(): void { 
     this.formSubmittingSource.next(); 
    } 

    endSubmittingForm(): void { 
     this.formSubmitedSource.next(); 
    } 
} 

您可以创建简单的组件输入和输出是这样的:

@Component({ 
    selector: 'myButton', 
    template: '<button (click)="buttonAction()">{{label}}</button>', 
    inputs: ['label'] 
}) 
export class MyButton { 
    @Input() 
    label:string; 

    @Output() 
    myButtonClick = new EventEmitter<any>(); 

    ... 

    buttonAction() { 
     this.tableButtonClick.emit("some value") 
    } 
} 

,然后在模板中像这样使用它:

<myButton [label]="sample" 
    (myButtonClick)="handleMyButtonClick($event)"> 
</myButton> 

$ event将字符串“some值”,但你可以用你喜欢的

你可以做你一样有角1做过任何对象,使用Observer

onClick(): void { 
    this.formService.buttonClick().subscribe(() => { 
    // You reach this when buttonClick is async terminated 
    // like your then() in your Angular 1 code 
    this.uClick() 
    ... 
    }); 
} 

而在你FormService返回可观察的:

buttonClick(): Observable<any> { 
    return this.buttonClicked$; 
}