template example directives javascript angular typescript angular2-template angular2-directives

javascript - example - Analizador de expresión angular 2 y directiva ng-init



directives angular 6 (2)

Básicamente, estoy buscando una forma de implementar una contraparte de la directiva Angular 1.x ngInit .

ngOnInit gancho ngOnInit y el hecho de que es el lugar recomendado para el código de inicialización. Considero que la directiva ngInit una manera rápida y declarativa de prototipar o corregir un componente que no debería usarse generalmente en un código de producción bien escrito (aunque un desarrollador tiene el derecho de elegir lo que sea mejor para él / ella).

Hacer algo así en la directiva ficticia init

<p [init]="foo = 1; bar()"><p>

evalúa la expresión más de una vez y causa

Errores de análisis de plantilla:

Error de analizador: enlaces no pueden contener asignaciones

error.

En Angular 1.x se podría hacer solo con

$parse($attrs.init)($scope)

¿Cómo se puede usar el analizador angular 2 y posiblemente se puede extender para evaluar foo = 1; bar() expresión de la plantilla foo = 1; bar() en la inicialización del componente?


Solo una solución alternativa ( demostración de Plunker ), vea la respuesta de estus para una solución

Directiva init :

@Directive({ selector: ''[init]'', inputs: [''init''] }) export class InitDir { init; ngOnChanges() { // `ngOnInit` if you want it to run just once if(this.init){ let iife = function(str){ return eval(str); }.call(this.init[0], this.init[1]); } } }

Uso:

@Component({ selector: ''my-app'', template: ` <div> <h2 [init]="[this, ''this.name = 1; this.bar();'']">Hello {{name}}</h2> </div> `, }) export class App { constructor() { this.name = ''Angular2 (Release Candidate!)'' } bar() { alert(''Yo Bar!''); } }


Es

@Directive({ selector: ''[initialize], [on-initialize]'' }) class InitializeDirective { @Output() initialize = new BehaviorSubject(); }

y

<div initialize (initialize)="initViaMethodCall(); foo = ''init via assignment''"></div> <ng-template initialize (initialize)="bar = ''init with no extra markup''"></template> {{ foo }} {{ bar }}