我正在使用AngularJs 1.5。我正在使用ng-route创建SPA。对于2个模板,我使用了新的Angular组件作为模板让我们称之为'employee'和'company'。在每个路由中都有一个子组件,它搜索公司数据库,称之为companySrch。子组件的工作原理是当用户想要在该模板中搜索公司数据库时,companySrch组件被加载到“公司”或“员工”中。当用户在搜索结果中选择一条记录时,该记录通过注册的RXJS可观察广播,如下所示:
companySrch.getRecordFn = function(result){
companySrch.output={id:result.cs_id, type:result.type,name:result.name, active: result.active};
//BROADCAST RECORD SELECTED via companySrchService
companySrch.companySrchService.recordBroadcast(companySrch.output);
companySrch.navService.nav.navExt = false;
}
然后,如果用户在员工或公司模板中,则该记录将通过模板的订阅传递给RXJS事件。模板员工和公司的示例分别为:
employee.companySrchService.subscribe(function(obj) {//SELECTRECORD IS PASSED VAR FROM BROADCAST FUNCTION
//GET COMPANY RECORD UPON BROADCAST
employee.submit[0].cs_name = obj.name;
employee.submit[0].cs_type = obj.type;
employee.submit[0].fk_cs_id = obj.id;
//employee.getRecordFn(obj.id);
});
company.companySrchService.subscribe(function(obj) {//SELECTRECORD IS PASSED VAR FROM BROADCAST FUNCTION
//GET COMPANY RECORD UPON BROADCAST
company.getRecordFn(obj.id);
});
当我在员工模板和companySrch记录中广播时,我遇到的问题是,假设我之前加载了公司模板,那么订阅的事件也会在“公司”中被触发。因此,这会导致错误。我认为当模板切换时组件被完全杀死?如果模板不在视图中,我有什么方法可以防止发生RXJS订阅事件吗?
答案 0 :(得分:3)
我们可以创建一个会在指令的$destroy
事件被触发后立即发出的主题。
var destroy$ = new Rx.Subject();
$scope.$on('$destroy', () => destroy$.onNext());
我们可以更新我们订阅的流,以便我们在destroy$
发出一次后立即停止发布项目:
company.companySrchService
.takeUntil(destroy$)
.subscribe(function(obj) {
company.getRecordFn(obj.id);
});
这会导致您的订阅回调在$destroy
事件发生后立即停止触发。