我有一个下拉列表,当我使用它时它可以工作,但它有两个问题:

  • 如果我刷新,则下拉菜单中的值为空
  • 如果我通过URI访问链接,则下拉菜单为空

我基本上想根据我所在的顺序来保留这个名字.想象一下,在下拉列表中有多个订单, Select 一个就会转到该页面.

// Topbar:

export class AppTopbarComponent implements OnInit {
  items?: MenuItem[];
  orders: Order[] = [];
  filteredOrders: any[] = [];
  selectedOrder: any[] = [];
  displayRoutes: string[] = ['/order'];

  constructor(
    public appMain: AppMainComponent,
    private ordersService: OrderService,
    private router: Router,
    private orderSelectionService: OrderSelectionService
  ) {}

  ngOnInit(): void {
    this.ordersService.getAllOrders().subscribe((orders) => {
      this.orders = orders;
    });

    this.router.events.subscribe((event) => {
      if (event instanceof NavigationEnd) {
        const shouldDisplayDropdown = this.displayRoutes.some((route) => event.url.startsWith(route));
        this.selectedOrder = shouldDisplayDropdown ? this.selectedOrder : [];
      }
    });

    this.orderSelectionService.selectedOrderName$.subscribe((selectedOrderName) => {
      this.selectedOrder = selectedOrderName;
    });
  }

  onOrderSelect(event: any) {
    const selectedOrderId = event.Id;
    this.orderSelectionService.setSelectedOrderName(event || []);
    this.router.navigate(['/order', selectedOrderId, 'home']);
  }
}

// Service:

@Injectable({
  providedIn: 'root',
})
export class OrderSelectionService {
  private selectedOrderSource = new BehaviorSubject<any[]>([]);

  selectedOrderName$: Observable<any[]> = this.selectedOrderSource.asObservable();

  setSelectedOrderName(orderName: any[]) {
    this.selectedOrderSource.next(orderName);
  }
}

到目前为止,我一直在设法弄到这条路由.

this.activatedRoute.params.subscribe((params) => {
  console.log('Route Params:', params);
  const selectedOrderId = params['id'];
  this.selectedOrder = this.orders.find((order) => order.Id === selectedOrderId) || [];
});

但它返回未定义的.

只是需要一些帮助来找出做到这一点的最佳方法.DisplayRoutes,这样做的方法是在不在特定路由上时重置下拉列表.

推荐答案

当你刷新屏幕时,服务会重置,这样你就可以摆脱维护状态的服务,并依赖于url参数,所以主题将没有任何值,所以你可以如下所示调整代码.

如果你仍然面临问题,你可以分享回堆叠闪电战与问题复制!

// Topbar:

export class AppTopbarComponent implements OnInit {
  items?: MenuItem[];
  orders: Order[] = [];
  filteredOrders: any[] = [];
  selectedOrder: any[] = [];
  displayRoutes: string[] = ['/order'];

  constructor(
    public appMain: AppMainComponent,
    private ordersService: OrderService,
    private router: Router,
    private orderSelectionService: OrderSelectionService
  ) {}

  ngOnInit(): void {
    this.ordersService.getAllOrders().subscribe((orders) => {
      this.orders = orders;
    });

    this.activatedRoute.params.subscribe((params) => {
        console.log('Route Params:', params);
        const selectedOrderId = params['id'];
        this.selectedOrder = this.orders.find((order) => order.Id ===  
            selectedOrderId) || [];
        // const shouldDisplayDropdown = this.displayRoutes.some((route) => event.url.startsWith(route)); // <-- this condition seems to be wrong, require stackblitz to debug
        const shouldDisplayDropdown = this.displayRoutes.some((route) => this.router.url.includes(route)) // get any route that matches the url
        this.selectedOrder = shouldDisplayDropdown ? [this.selectedOrder] : 
            [];
    });

  onOrderSelect(event: any) {
    const selectedOrderId = event.Id;
    this.router.navigate(['/order', selectedOrderId, 'home']);
  }
}

Typescript相关问答推荐

如何使用Generics保留构造函数的类型信息?

返回对象的TypScript构造函数隐式地替换This的值来替换super(.)的任何调用者?

node—redis:如何在redis timeSeries上查询argmin?

Angular 信号:当输入信号改变值时,S触发取数的正确方式是什么?

如何在单击停止录制按钮后停用摄像机?(使用React.js和Reaction-Media-Recorder)

Express Yup显示所有字段的所有错误

接口中函数的条件参数

为什么我的一个合成函数不能推断类型?

在Reaction-Native-ReAnimated中不存在Animated.Value

使用TypeScrip5强制使用方法参数类型的实验方法修饰符

如何避免从引用<;字符串&>到引用<;字符串|未定义&>;的不安全赋值?

在抽象类属性定义中扩展泛型类型

如何为特定参数定义子路由?

更漂亮的格式数组<;T>;到T[]

组件使用forwardRef类型脚本时传递props

如何使用 Angular 确定给定值是否与应用程序中特定单选按钮的值匹配?

使用 fp-ts 时如何使用 TypeScript 序列化任务执行?

是否可以使用元组中对象的键来映射类型

React router - 如何处理嵌套路由?

const 使用条件类型时,通用类型参数不会推断为 const