Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJS:如何在多个行为主题源之间切换_Javascript_Angular_Typescript_Rxjs - Fatal编程技术网

Javascript RxJS:如何在多个行为主题源之间切换

Javascript RxJS:如何在多个行为主题源之间切换,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,场景: 我有一个网格,我想在其中显示数据。我可能有两个(或更多)行为主题数据源。我还有一个toggle observable,它返回一个数字,指示我要从哪个源显示数据(即1表示源1,2表示源2,等等) 问题: 我如何组合n个源,但只从源中发出切换可观察的记录?我的网格将订阅生成的可观测数据。当toggle observable发出时,我希望从所选源发出最新的信号 // Sources let source1 = new BehaviorSubject([]); let source2 = new

场景:

我有一个网格,我想在其中显示数据。我可能有两个(或更多)行为主题数据源。我还有一个toggle observable,它返回一个数字,指示我要从哪个源显示数据(即1表示源1,2表示源2,等等)

问题:

我如何组合n个源,但只从源中发出切换可观察的记录?我的网格将订阅生成的可观测数据。当toggle observable发出时,我希望从所选源发出最新的信号

// Sources
let source1 = new BehaviorSubject([]);
let source2 = new BehaviorSubject([]);

// Toggle observable
let toggle = new BehaviorSubject(1); // default to source one

// Combined observable
let gridDataSource = ????

我认为
switchMap
可以实现这一点。根据定义,其目的是在多个源之间切换

// Sources
let sources = [
  new BehaviorSubject([]),
  new BehaviorSubject([]),
];

// Toggle observable
let toggle = new BehaviorSubject(0); // default to the first source

// Selected observable
let gridDataSource = toggle.switchMap((i) => source[i]);
如果不能或不想使用源数组,可以回退到switchMap声明中的一个简单开关案例

let gridDataSource = toggle.switchMap((i) => {
    switch(i) {
        case 1: return source1;
        case 2: return source2;
    }
});

如果您不需要发出初始值,请尝试
com-binelate-est
与Lat-est-From
。如果顺序很重要,则使用
concatMap
,如果不重要,则使用
mergeMap
switchMap
flatMap
我确实需要一个初始值,但我不确定您所说的顺序是什么意思。我只想从其中一个源发射,具体取决于选择的源。基本上,网格旁边会有一个源下拉选择器。你不能创建一个单独的b.subject,然后再订阅它,而不是创建许多b.subject。因为一个子项目的所有子描述者共享该子项目的相同执行。在您的下拉选择器上,您可以通过
添加值。next()
能够非常快速地实现这一点,而不会出现任何问题,并且它的行为完全符合我的期望。谢谢