Angular JS 1.5 - 在两个组件

时间:2016-03-18 06:43:52

标签: angularjs rxjs

我正在使用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订阅事件吗?

1 个答案:

答案 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事件发生后立即停止触发。