当满足某些`* ngIf`条件时,如何从类装饰器调用某个方法?

时间:2016-04-18 23:24:07

标签: typescript angular

当满足某些*ngIf条件时,如何从类装饰器调用某个方法。我有一个完全像this AngularJS问题的场景,其中使用ng-init()但ng-init不是Angular2的一部分

<div *ngIf="obj.someProperty" callSomeMethod() >
 <!--render inner parts-->
</div>

2 个答案:

答案 0 :(得分:2)

这取决于callSomeMethod()正在做什么,但有一种可能性是向*ngIf元素添加一个指令,并在该指令的OnInit挂钩中执行该逻辑。

<div *ngIf="obj.someProperty" some-method-directive>
   <!--render inner parts-->
</div>

其他地方:

@Directive({
   selector='[some-method-directive]',
})
class SomeMethodDirective implements OnInit { // OnInit imported from angular2/core

   ngOnInit(){
      // insert your someMethod lofic
   }
}

如果您需要访问此方法中的父组件,您可以通过指令中的构造函数注入来获取它:

constructor(@Host(ParentComponent) private parent: ParentComponent){ }

然后您就可以通过this.parent访问它了。

对于ng1方法,这是我能想到的最类似的方法,但就像我说的 - 取决于someMethod()需要完成的内容,它可能不是一个可行的解决方案。如果没有,请评论/编辑您的问题以解释原因,这将让我更好地了解我们在这里做了什么。

答案 1 :(得分:2)

可以使用自定义ngIf指令和template语法:

<template [ngCondition]="obj.someProperty" (show)="callSomeMethod()">
 <h3 >if callback!</h3>
</template>

你应该能够为真/假(显示/隐藏)条件添加回调。

指令来源:

@Directive({
    selector: '[ngCondition]'
})
export class NgCondition
{
    @Output('show')
    private show:EventEmitter<any> = new EventEmitter<any>();

    @Output('hide')
    private hide:EventEmitter<any> = new EventEmitter<any>();

    private _viewContainer:ViewContainerRef;
    private _templateRef:TemplateRef;
    private _prevCondition:any;

    constructor(_viewContainer:ViewContainerRef, _templateRef:TemplateRef)
    {
        this._viewContainer = _viewContainer;   
        this._templateRef = _templateRef;
        this._prevCondition = null;
    }

    @Input()
    public set ngCondition(newCondition:boolean)
    {
        if (newCondition && (isBlank(this._prevCondition) || !this._prevCondition))
        {
            this._prevCondition = true;
            this._viewContainer.createEmbeddedView(this._templateRef);
            this.show.emit({});
        }
        else if (!newCondition && (isBlank(this._prevCondition) || this._prevCondition))
        {
            this._prevCondition = false;
            this._viewContainer.clear();
            this.hide.emit({});
        }
    }
}