主题和可观察,如何删除项目,filter()列表和next()

2024-01-09

我有一个包含主题和可观察的歌曲设置列表(显示为| async在视图中),现在我想从列表中删除一首歌曲,请执行一些操作filter()并打电话next()就此主题而言。

如何以及在哪里进行过滤?现在我正在做getValue()关于主题并将其传递给next()关于,好吧,主题。这似乎是错误的和循环的。

我还尝试订阅主题并以这种方式获取数据,过滤它并调用next() inside subscribe(),但我遇到了 RangeError。

我可以通过存储所有已删除的 id 来过滤 Observable。然后,主题的列表会因为删除了那里的歌曲而变得不同步,而且每个观察者都必须拥有已删除的 id 列表,这看起来很可笑。我的精神和精神都在迅速变老。请帮助我上网:(

export class ArtistComponent implements OnInit {
  private repertoire$;
  private repertoireSubject;
  constructor(
    private route: ActivatedRoute,
    private service: ArtistService
  ) {
    this.getRepertoire().subscribe(
      songs => this.repertoireSubject.next(songs)
    );
  }

  getRepertoire() {
    return this.route.paramMap
      .switchMap((params: ParamMap) =>
      this.service.fetchRepertoire(params.get('id')));
  }

  //THIS IS WHERE I'M HAVING TROUBLE
  delete(id): void {
    this.repertoireSubject.next(
      this.repertoireSubject.getValue().filter(song => (song.id !== id))
    );
    // TODO remove song from repertoire API
  }

  ngOnInit() {
    this.repertoireSubject = new BehaviorSubject<any>(null);
    this.repertoire$ = this.repertoireSubject.asObservable();
  }

}

我建议您在组件上创建新属性,您将在其中最后存储状态。 (这里理解歌曲数组)。

总是更好地通过代表您的状态(或存储)的内部属性和具有同步应用程序其余部分(通过可观察/事件)的角色的另一个属性来概念化您的代码。

另一个技巧是按模型强类型化您的代码。将更容易调试和维护。

然后你只需根据你的逻辑更新它,然后更新你的主题

export interface SongModel {
        id: number;
        title: string;
        artiste: string;
    }

    export class ArtistComponent implements OnInit {
        private repertoire$ : Observable<SongModel[]>;
        private repertoireSubject: BehaviorSubject<SongModel[]>;
        //Array of song, should be same type than repertoireSubject.
        private songs: SongModel[];

        constructor(
            private route: ActivatedRoute,
            private service: ArtistService
        ) {

            //We push all actual references.
            this.getRepertoire().subscribe(
                songs => {
                    this.songs = songs;
                    this.repertoireSubject.next(this.songs);
                }
            );
        }

        ngOnInit() {
            //Because is suject of array, you should init by empty array.
            this.repertoireSubject = new BehaviorSubject<SongModel[]>([]);
            this.repertoire$ = this.repertoireSubject.asObservable();
        }


        getRepertoire() {
            return this.route.paramMap
                .switchMap((params: ParamMap) =>
                this.service.fetchRepertoire(params.get('id')));
        }

        //THIS IS WHERE I'M HAVING TROUBLE
        delete(id: number): void {
            // Update your array referencial.
            this.songs = this.songs.filter(songs => songs.id !== id);
            // Notify rest of your application.
            this.repertoireSubject.next(this.songs);
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主题和可观察,如何删除项目,filter()列表和next() 的相关文章

  • 为什么 Angular 4.3 中的 httpclient 返回 Object 而不是 any?

    Angular 4 3 中的新 HttpClient 类似乎又回来了Object代替any默认情况下 鉴于打字稿文档所述 这样做是否有特殊原因 永远不要使用数字 字符串 布尔值或对象类型 这些 类型指的是几乎从未使用过的非原始装箱对象 适当
  • 如何连接我的 angular2 应用程序 javascript 文件

    对于我的 Angular2 TypeScript 应用程序 我将所有 js 文件合并到一个 app min js 文件中 然后 System import 将此文件导入到我的 index html 页面 然后我得到一个同一模块文件中的多个匿
  • router.navigate 更改 URL,但不渲染组件

    而不是使用 a href my path my param a 在我的模板中 我愿意使用带参数的函数将我重定向到页面 所以 这就是我在 ts 文件中构建函数的方式 redirectToChat my param this router na
  • 是否可以在 Ionic 2 中存储 firebase 数据并以离线模式运行应用程序功能?

    我找到了一些关于 Ionic 2 离线模式 firebase 的教程 但我仍然不知道如何在我的应用程序中启用这个功能 那么 firebase真的支持离线模式吗 如果是 我可以存储所有收到的数据吗 and 在离线模式下运行功能 firebas
  • Angular 2 形式 + OnPush

    我正在编写一个 Angular 2 应用程序 出于性能原因 我尝试在任何地方使用 ChangeDetectionStrategy OnPush 我有一个复杂的组件 需要 OnPush 才能顺利工作 其中包含另一个显示表单的组件 使用 For
  • 使用许多嵌套的 switchMap 是不好的做法吗?

    我有 HTTP 拦截器 在该拦截器中 在更改请求之前 我需要打开一个加载程序 真正让我担心的是我最终会得到很多switchMaps why 加载器是异步的 我还需要将从拦截器传递的消息转换为加载器服务 翻译消息也是异步的 在拦截器中 我应该
  • 如何在 Typescript 中使用正则表达式进行电子邮件验证[重复]

    这个问题在这里已经有答案了 我需要使用 typescript Angular 应用程序验证 Excel 文件中的电子邮件和日期字段 我尝试使用正则表达式进行验证 但对于正确的电子邮件地址 结果始终返回 false 谁能帮我验证电子邮件和日期
  • Angular 2打开静态页面

    我有 Angular 2 项目 我想在新窗口中打开服务器上可用的静态帮助文件 我试过window open help index html 它导航到该页面 但抛出有关找不到路线的错误 我也尝试在角度区域外运行上面的代码 但没有什么区别 我怀
  • 使用 HttpClient 而不是 Http,类型“Subscription”不可分配给类型“Observable”Angular 5

    我正在尝试使用新的 HttpClient 类而不是旧的 Http 我想映射从订阅方法获得的数据 但出现以下错误 关于为什么我得到这个有什么建议吗 Code export class YoutubeSearchService construc
  • 传单 - 导入 Geojson - Angular 6

    我尝试将 GeoJson 文件导入到 Angular 的应用程序 6 中的传单中 通过这个解决方案 我的 geojson 是在 leafletmap 中绘制的 但我有这个错误 我无法构建我的应用程序 有人知道一种解决方案吗 错误 TS234
  • html输入数字,min + step,使step忽略min?

    是否有可能使step忽略min属性
  • Angular 2 组件:子对子通信

    我的 Angular 2 应用程序中有三个组件 C0 C1 和 C2 第一个 C0 表示一个 html 模板 具有多个子组件 ui 元素 现在 如果有人点击C1 中的按钮 菜单 我怎样才能通知C2 日历 关于那件事 我尝试了一些例子组件通讯
  • 配置 htaccess 以使用 Angular 和 PHP 路由

    我正在尝试使用 Angular 4 和 PHP 路由 但我无法配置它以便同时使用两者 我可以让它与其中之一一起工作 但不能同时与两者一起工作 这是我的文件夹结构 root index html vendor bundle js other
  • 如何按顺序使用 RxJS 可观察量?

    事情是这样的 我有一个 HTTP get 请求 它返回一个 JSON 对象列表 我使用 RxJS 订阅接收该列表的数据 现在 对于该列表中的每个对象 我想执行另一个 HTTP 请求 然后将该请求的结果放入数组中 到目前为止 我已经能够做到这
  • 在 Angular 中导入和使用 lodash 的正确方法

    我曾经能够通过如下所示的 import 语句在 Angular 中使用 lodash 方法 import debounce as debounce from lodash 我现在在使用该语句时收到以下错误 node modules type
  • Angular2 和 lodash...找不到名称

    Angular2 和 lodash 为什么有这么多戏剧性的事情 我的意思是真的 下面是我的安装方法 npm install save lodash npm install save types lodash UPDATE 我按照博客做了这个
  • 如何在 d3 中使用SimulationLinkDatum和SimulationNodeDatum

    我在使用SimulationLinkDatum 类型时遇到问题 我创建了两个类 Node 和 Link 来实现SimulationNodeDatum 和SimulationLinkDatum 当我尝试使用SimulationLinkDatu
  • 如何仅使用 TypeScript 声明属性为字符串类型的对象?

    我的组件中有一个像这样的配置数组 config ButtonConfig this config push new ButtonConfig 今天 我意识到让数组表现得像字典更有意义 这样我就可以不通过数字索引而是通过名称规范地访问特定元素
  • 将路由参数从父路由传递到子路由

    我的路线结构如下 parent id child child 我可以通过以下方式从父组件获取参数吗 ngOnInit this route params subscribe params gt this id params id 然后将其作
  • 如何在 Angular4 中上传相同的文件

    我能够成功上传文件 但现在的问题是它不允许我两次上传同一文件 这是我的代码

随机推荐