Package Exports
- ngx-bind-io
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (ngx-bind-io) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Directives for auto binding Input() and Output() in Angular7+ application
Attention !!! For correct work in AOT, all Inputs and Outputs must be initialized, you can set them to "undefined".
For check project for use bindIO directives, you may use ngx-bind-io-cli and run:
npx ngx-bind-io-cli ./src --maxInputs=0 --maxOutputs=0For check and add initialize statement, you may run:
npx ngx-bind-io-cli ./src --fix --maxInputs=0 --maxOutputs=0Example
Without auto binding inputs and outputs
<component-name
(start)="onStart()"
[isLoading]="isLoading$ | async"
[propA]="propA"
[propB]="propB">
</component-name>With auto binding inputs and outputs
<component-name
bindIO>
</component-name>Installation
npm i --save ngx-bind-ioLinks
Demo - Demo application with ngx-bind-io.
Stackblitz - Simply sample of usage on https://stackblitz.com
Usage
app.module.ts
import { NgxBindIOModule } from 'ngx-bind-io';
import { ChildComponent } from './child.component';
import { ParentComponent } from './parent.component';
@NgModule({
...
imports: [
...
NgxBindIOModule.forRoot(), // in components import as "NgxBindIOModule"
...
]
declarations: [
...
ChildComponent,
ParentComponent
...
],
...
})
export class AppModule { }child.component.ts
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
@Component({
selector: 'child',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div *ngIf="isLoading">Loading... (5s)</div>
<button (click)="onStart()">Start</button> <br />
{{ propA }} <br />
{{ propB }}
`
})
export class ChildComponent {
@Input()
isLoading: boolean = undefined;
@Input()
propA = 'Prop A: not defined';
@Input()
propB = 'Prop B: not defined';
@Output()
start = new EventEmitter();
onStart() {
this.start.next(true);
}
}base-parent.component.ts
import { BehaviorSubject } from 'rxjs';
export class BaseParentComponent {
isLoading$ = new BehaviorSubject(false);
onStart() {
this.isLoading$.next(true);
setTimeout(() => this.isLoading$.next(false), 5000);
}
}parent.component.ts
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { BaseParentComponent } from './base-parent.component';
@Component({
selector: 'parent',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<child bindIO></child>
`
})
export class ParentComponent extends BaseParentComponent {
propA = 'Prop A: defined';
propB = 'Prop B: defined';
}Debug
For global debug all bindings
import { NgxBindIOModule } from 'ngx-bind-io';
@NgModule({
...
imports: [
...
NgxBindIOModule.forRoot({debug: true})
...
],
...
})
export class AppModule { }For debug on one place
<comp-name [bindIO]="{debug:true}"></comp-name>Custom rules for detect output method
my-ngx-bind-outputs.service.ts
import { IBindIO, NgxBindOutputsService } from 'ngx-bind-io';
export class MyNgxBindOutputsService extends NgxBindOutputsService {
checkKeyNameToOutputBind(directive: Partial<INgxBindIODirective>, parentKey: string, key: string) {
const outputs = directive.outputs;
const keyWithFirstUpperLetter = key.length > 0 ? key.charAt(0).toUpperCase() + key.substr(1) : key;
return (
(parentKey === `on${keyWithFirstUpperLetter}` &&
outputs.parentKeys.indexOf(`on${keyWithFirstUpperLetter}Click`) === -1 &&
outputs.parentKeys.indexOf(`on${keyWithFirstUpperLetter}ButtonClick`) === -1) ||
(parentKey === `on${keyWithFirstUpperLetter}Click` &&
outputs.parentKeys.indexOf(`on${keyWithFirstUpperLetter}ButtonClick`) === -1) ||
parentKey === `on${keyWithFirstUpperLetter}ButtonClick`
);
}
}
app.module.ts
import { NgxBindOutputsService, NgxBindIOModule } from 'ngx-bind-io';
import { MyNgxBindOutputsService } from './shared/utils/my-ngx-bind-outputs.service';
import { ChildComponent } from './child.component';
import { ParentComponent } from './parent.component';
@NgModule({
declarations: [AppComponent],
imports: [
...
NgxBindIOModule,
...
],
declarations: [
AppComponent,
ChildComponent,
ParentComponent,
...
],
providers: [
...
{ provide: NgxBindOutputsService, useClass: MyNgxBindOutputsService },
...
],
bootstrap: [AppComponent]
})
export class AppModule { }Default rules for detect output method
ngx-bind-outputs.service.ts
export class NgxBindOutputsService {
...
checkKeyNameToOutputBind(directive: Partial<INgxBindIODirective>, parentKey: string, key: string) {
const outputs = directive.outputs;
const keyWithFirstUpperLetter = key.length > 0 ? key.charAt(0).toUpperCase() + key.substr(1) : key;
return (
(parentKey === `on${keyWithFirstUpperLetter}` &&
outputs.parentKeys.indexOf(`on${keyWithFirstUpperLetter}Click`) === -1) ||
parentKey === `on${keyWithFirstUpperLetter}Click`
);
}
...
}Default rules for detect inputs variables
ngx-bind-inputs.service.ts
export class NgxBindInputsService {
...
checkKeyNameToInputBind(directive: Partial<INgxBindIODirective>, parentKey: string, key: string) {
return parentKey === key && parentKey[0] !== '_';
}
...
checkKeyNameToObservableInputBind(directive: Partial<INgxBindIODirective>, parentKey, key) {
return parentKey === `${key}$`;
}
...
}License
MIT