代码之家  ›  专栏  ›  技术社区  ›  Johan Rin

具有一对多关系的可观察数据服务

  •  2
  • Johan Rin  · 技术社区  · 6 年前

    我试图在代码中实现角度可观察的数据服务,但我对这种方法有点困惑。

    我有以下数据模型:主题——一对多——类别

    主题

    export class Theme {
      _id: string;
      name: string;
      description: string;
      iconCode: string;
      categories: Category[];
      createdAt: Date;
      updatedAt: Date;
    

    类别

    export class Category {
      _id: string;
      name: string;
      description: string;
      createdAt: Date;
      updatedAt: Date;
    

    我为主题的可观察数据服务编写了以下代码:

    export class ThemeStoreService {
    
      private _themes: BehaviorSubject<Theme[]> = new BehaviorSubject<Theme[]>([]);
      private dataStore: {
        themes: Theme[]
      };
    
      constructor(private themeBackendService: ThemeBackendService) {
        this.dataStore = { themes: [] };
        this._themes = new BehaviorSubject<Theme[]>([]);
      }
    
      get themes() {
        return this._themes.asObservable();
      }
    

    我想知道与主题相关的范畴的可观察数据服务的写作。 在我的项目中,我使用了一个navbar,它是一个包含一个类别子列表的主题列表。创建新类别后,我想刷新列表和子列表。

    • 我是否还需要为类别使用行为主题?
    • 如何在这两个对象之间建立链接?

    下面是我对该类别的可观察数据服务的实际代码:

    export class CategoryStoreService {
    
      private _categories: Observable<Category[]>
      private dataStore: {
        categories: Category[]
      };
    
      constructor(private themeStoreService: ThemeStoreService) {
        this.dataStore = { categories: [] };
        this._categories = this.themeStoreService.themes.pipe(
          map(themes => {
            themes.forEach(theme => {
              theme.categories = this.dataStore.categories;
            })
          })
        )
      }
    
      get categories() {
        return this._categories;
      }
    

    有什么反馈或例子可以帮助我吗?

    事先谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Abhishek Jaiswal    6 年前

    您将返回作为observable的\u主题,这是类型的新实例 BehaviorSubject<Theme[]> ,当您在主题中接收到它时,它将成为类型 BehaviourSubject<Theme[]> ,然后对其类别部分进行赋值,但作为一个整体,主题仍然是类型 行为主题<主题[]> . 但当您将其分配给此时,.\u类型 Observable<Category[]> ,这是不匹配的。 对于解决方案,您可以返回_主题.类别或者接收主题而不是类别。

    我希望这一定是造成类型不匹配。