Angular 2 个表达式解析器和 ng-init 指令

Angular 2 expression parser and ng-init directive

基本上我正在寻找一种方法来实现 Angular 1.x ngInit 指令的对应方法。

我知道 ngOnInit 挂钩,而且它是初始化代码的推荐位置。我认为 ngInit 指令是一种快速、声明性的方式来原型化或修复通常不应在编写良好的生产代码中使用的组件(尽管开发人员有权选择最适合 him/her 的方式) .

init 虚拟指令中做类似的事情

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

多次计算表达式并导致

Template parse errors:

Parser Error: Bindings cannot contain assignments

错误。

在 Angular 1.x 中只需

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

如何使用并可能扩展 Angular 2 解析器以在组件初始化时评估 foo = 1; bar() 模板表达式?

只是一个解决方法(Plunker Demo),请参阅 estus 的解决方案答案

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]);
    }
  }
}

用法:

@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!');
  }
}

这可以通过一个指令来实现:

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

预期用途是:

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