【发布时间】:2026-02-06 06:50:01
【问题描述】:
class item {
name: string;
order: number;
}
let onUp = new Rx.Subject<item>();
let list = new Rx.BehaviorSubject<item>([
{ name: "7", order: 70 },
{ name: "2", order: 20 },
{ name: "5", order: 50 },
{ name: "3", order: 30 },
{ name: "4", order: 40 },
{ name: "6", order: 60 },
{ name: "1", order: 10 }
]);
list.subscribe(console.log);
onUp.subscribe(anItem => {
let numberList: item[];
list
.take(1)
.map(x => x.sort((a, b) => a.order - b.order))
.subscribe(ddList => (numberList = ddList));
let index = numberList.indexOf(numberList.find(num => num.order == anItem));
let ddvalue = numberList[index];
let preddvalue = numberList[index - 1];
let preddvalueOrder = preddvalue.order;
preddvalue.order = ddvalue.order;
ddvalue.order = preddvalue.order;
list.next(numberList);
});
onUp.next(30);
与列表中的另一个对象交换“订单”值的反应方式是什么?
我有一堆物品应该可以重新排序。
项目的顺序基于项目列表中项目对象的 order 属性。 我通过切换两个项目的 order 属性来重新排序项目。 在示例代码中,onUp Subject 发出了一个 orderNumber,该 orderNumber 应该与上面的 item 切换(按 order 属性排序)
示例代码有效,只是因为第二次订阅是异步的,因此它可能是不好的做法。 另一种方法是在外部订阅内部的订阅内部进行重新排序,但这也是不好的做法(不知道为什么除了它是一个凌乱的巢穴之外)。
我总是看到 flatMap,但如果我理解正确,第二次订阅只会使用第一次订阅中的数据来获取数据。 在这种情况下,我需要来自第一个和第二个主题的数据来切换这两个项目,并将新列表推送到列表主题。
【问题讨论】:
标签: rxjs