取消订阅页面更改时的事件

时间:2016-09-21 12:10:54

标签: events angular ionic2

当我不断向导航堆栈添加页面时,会创建越来越多的SimpleComponent类实例。出于这个原因,我不止一次订阅" ev"事件和消防代码不止一次。

您可以通过"那里"来检查和"返回"在我的plunker示例和不同情况下的触发事件(检查控制台警告结果)。您还可以看到,即使您回到导航堆栈的顶部,您仍然可以订阅。

ionViewWillLeave不起作用可能是因为它不是我离开的实际视图

我想知道我该怎么办才能避免这种情况?我想将SimpleComponent包含在旧式AngularJS指令中,因为我在我的应用程序中多次使用它。

Here is plunker

export class SimpleComponent {
  constructor(private ev: Events) {
    this.ev.subscribe('ev', e => {
      console.warn(e[0]);
    });  
  }
}


// home.ts template
    <simple-component></simple-component>
    <button (click)="go()">Go next page</button>
    <button (click)="raiseEv()">Raise Event</button>

2 个答案:

答案 0 :(得分:2)

您可以OnDestroy实施unsubscribeev可以import { OnDestroy } from '@angular/core'; export class SimpleComponent implements OnDestroy { ngOnDestroy() { this.ev.unsubscribe(); }

public function insertFund($request,$lender, $ftype, $sign)
{
    $fmamt = str_replace(".","",$request->fmamt );
    $fdesc = $request->fdesc;
    $fdate = $request->fdate;
    $trnsfer  = $request->file('upload_trnsfer');   
    $transid = date("ym")."01";      

    if($fdesc == null)
    {
        $fdesc = '';
    }
    $fund = $this->fund->create([
        'lender_id' => $lender->id,
        'transid' => $transid,
        'fmamt' => $fmamt,
        'refdc' => '',
        'ftype' => $ftype,
        'sign'  => $sign,
        'fdesc' => $fdesc,
        'fdate' => $fdate,
        'fstat' => 'pending'
    ]);

    $fund->transid = date("ym").'01'.str_pad($fund->id, 5, '0', STR_PAD_LEFT);                
    $fund->save();        
    return $fund;
}

来自Angular 2 documentation

  

将清理逻辑放在ngOnDestroy中,这是在Angular破坏指令之前必须运行的逻辑。现在是时候通知应用程序的另一部分该组件正在消失。这是释放不会自动收集垃圾的资源的地方。取消订阅observables和DOM事件。停止间隔计时器。取消注册此指令向全局或应用程序服务注册的所有回调。如果我们忽视这样做,我们会冒内存泄漏的风险。

答案 1 :(得分:1)

我决定将我的代码负责处理事后收到的操作到@Injectable,这解决了问题