当满足某些*ngIf
条件时,如何从类装饰器调用某个方法。我有一个完全像this AngularJS问题的场景,其中使用ng-init()但ng-init不是Angular2的一部分
<div *ngIf="obj.someProperty" callSomeMethod() >
<!--render inner parts-->
</div>
答案 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({});
}
}
}