首页 文章

Angular JS 1.5 - 在两个组件中使用Observable RXJS

提问于
浏览
2

我正在使用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 回答

  • 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 事件发生后立即停止触发 .

相关问题