当我不断向导航堆栈添加页面时,会创建越来越多的SimpleComponent类实例。出于这个原因,我不止一次订阅" ev"事件和消防代码不止一次。
您可以通过"那里"来检查和"返回"在我的plunker示例和不同情况下的触发事件(检查控制台警告结果)。您还可以看到,即使您回到导航堆栈的顶部,您仍然可以订阅。
ionViewWillLeave不起作用可能是因为它不是我离开的实际视图
我想知道我该怎么办才能避免这种情况?我想将SimpleComponent包含在旧式AngularJS指令中,因为我在我的应用程序中多次使用它。
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>
答案 0 :(得分:2)
您可以OnDestroy
实施unsubscribe
,ev
可以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;
}
将清理逻辑放在ngOnDestroy中,这是在Angular破坏指令之前必须运行的逻辑。现在是时候通知应用程序的另一部分该组件正在消失。这是释放不会自动收集垃圾的资源的地方。取消订阅observables和DOM事件。停止间隔计时器。取消注册此指令向全局或应用程序服务注册的所有回调。如果我们忽视这样做,我们会冒内存泄漏的风险。
答案 1 :(得分:1)
我决定将我的代码负责处理事后收到的操作到@Injectable,这解决了问题