1.0.2 • Published 5 years ago

sprang-angular-decorators v1.0.2

Weekly downloads
3
License
MIT
Repository
github
Last release
5 years ago

sprang-angular-decorators

Angular decorators for angular 1 inspired by ng-forward and java/spring annotations

Bootstrap

import { setModule, startAutowiring } from 'sprang-angular-decorators';

let dependencies = [
    'ngMessages',
    'ngAnimate'
];

setModule(angular.module('App', dependencies)
    .run(['$injector', ($injector: ng.auto.IInjectorService) => {
        startAutowiring($injector);
    }])
);

angular.bootstrap(document.documentElement, ['App'], { strictDi: true });

@Autowired

Auto injection of services

import { MyService } from './../myService';

export class X {  

    @Autowired(()=>MyService)
    private myService:MyService
    
    @Autowired('$timeout')
  	private $timeout: ng.ITimeoutService;

    constructor() {}  
}

Notes:

  • Angular native services are injected via there name as a string
  • Custom angular services (decorated with @Service) are injected via a function returning corresponding class

@Service

Registers an angular service

@Service()  
export class MyService {}

@Component

Registers an angular component

@Component({
    selector:'my-component-selector'  // '[my-component-selector]' for attribute selector
    template?:string,
    templateUrl?:string
    ... // and all other "classic" component config values
})
class MyComponent implements ng.ComponentLifeCycle {
    
    constructor(){}
    
    $onInit() {
    }

    $onChanges(changes:ng.Changes) {

    }

    $doCheck() {
    }

    $onDestroy() {
    }

    $postLink() {
    }
}

Warning !!! $ctrl shall be used in templates => {{$ctrl.x}}

@Controller

Registers an angular controller

@Controller()  
export class MyController {}

@NgElement

Auto injects components HTMLElement

@Controller()  
export class MyComponentOnly {

    @NgElement
    private $element:ng.IAugmentedJQuery;

}

@NgAttrs

Auto injects component attributes (Input or BindString shall be prefered)

@Controller()  
export class MyComponentOnly {

    @NgAttrs
    private $Attrs:ng.IAttributes;

}

@NgScope

Auto injects angular scope

@Controller()  
export class MyComponentOrController {

    @NgScope
    private scope:ng.IScope;

}

@Input

@Component(...)
class X {
    @Input() inputA;
    @Input('customInputB') inputB;

    $onChanges(changes:any) {
        if(changes[inputA].previousValue !== changes[inputA].currentValue) {
            ...
        }
    }
}
<elt input-a="scopeVarA" custom-input-b="scopeVarB"></elt>

Any modification of scopeVarA and scopeVarB values will be reported respectively on inputA and inputB (but only in this direction)

Modification can be watch via $onChanges lifecycle method

@Output

@Component(...)
@Inject('$element')
class X {

    @Output() outputA = new OutputEmitter('outputA',this);
    @Output('customOutputB') outputB = new OutputEmitter('outputB',this);

    constructor(private $element:ng.IAugmentedJQuery) {}

    ... {
        this.outputA.emit('john');
        this.outputB.emit({name:'doe'})
    }

}
<elt (output-a)="handlera($event)" (custom-output-b)="handlerb($event)"></elt>
scope.handlera=(e)=>{console.log(e)} // -> 'john'
scope.handlerb=(ev)=>{console.log(ev)} // -> {name:'doe'} 

Note: all native events are also available click, mouseover... with (...)="" syntax. e.g: (click)="clickHandler($event)"

@BindString

@Component(...)
class X {
    @BindString() stringA;
    @BindString('customStringB') stringB;
}
<elt string-a="john" custom-string-b="doe"></elt>

Will set

stringA with "john" stringB with "doe"

@Require

@Component(...)
class X {
    Require('ngModel') modelCtrl;
}
<elt ng-model="scopeVar"></elt>

@Filter

@Filter('filterName')
class X {
  filter(...):any {
    return ...;
  }
}

@SnabbComponent

@SnabbComponent
export class SComponentName extends SnabbdomComponent<Props> {
    constructor() {
        super();
    }

    protected view() {
        ...
    }
    ...
}

@NgEventBus

Annotate class that implements event bus

@NgEventBus
export class MyBus {
    ...
}

@ListenBus()

export class MyComponent {
    ...

    @ListenBus(()=>MyEvent)
    protected myMethod(data:MyEventData) {
        ...
    }
}

myMethod will be called each time MyEvent is fired by class annotated with @NgEventBus. ListenBus decorator will automatically unregister bus listener when component is destroyed.