javascript - 由于 Observable 订阅发生在组件上,因此我很难将逻辑重构到 Angular 2 应用程序的服务层中

标签 javascript angular typescript rxjs observable

我在 Angular 2 应用程序中使用可观察量时发现的一件事是,因为在您订阅组件中的可观察量之前实际上不会“发生”任何事情,因此通过将逻辑移动到服务层。

例如,下面是一个函数示例,该函数接收排序参数,然后相应地过滤显示到 View 的数据。这使用了我的组件中发生订阅的可观察对象,如下所示:

onSortReceived(sort)
{
    if (sort === 'alphabetical')
    {
        this.filtersService.getByFilter(this.page, this.pagesize, this.body)
        .subscribe(resRecordsData => {
            this.records = resRecordsData;
            this.data = resRecordsData.data;
            this.data.sort((a, b) => a.name.last.localeCompare(b.name.last));
        },
        responseRecordsError => this.errorMsg = responseRecordsError);
    }
    else if (sort === 'reverse alphabetical')
    {
        this.filtersService.getByFilter(this.page, this.pagesize, this.body)
        .subscribe(resRecordsData => {
            this.records = resRecordsData;
            this.data = resRecordsData.data;
            this.data.sort((a, b) => b.name.last.localeCompare(a.name.last));
        },
        responseRecordsError => this.errorMsg = responseRecordsError);
    }
    else if (sort === 'id')
        {
        this.filtersService.getByFilter(this.page, this.pagesize, this.body)
        .subscribe(resRecordsData => {
            this.records = resRecordsData;
            this.data = resRecordsData.data;
            this.data.sort((a, b) => b._id.localeCompare(a._id));
        },
        responseRecordsError => this.errorMsg = responseRecordsError);
    }
    else if (sort === 'reset') {
        this.filtersService.getByFilter(this.page, this.pagesize, this.body)
        .subscribe(resRecordsData => {
            this.records = resRecordsData;
            this.data = resRecordsData.data;
        },
        responseRecordsError => this.errorMsg = responseRecordsError);
    }
}

现在,我不想在执行此操作的每个组件中重复此代码,而是希望将大部分逻辑移至服务层。但由于过滤是在订阅之后发生的,并且订阅发生在组件级别,所以我不确定如何执行此操作。有没有办法可以先过滤,然后订阅可观察的?那会是什么样子?如果我能做到这一点,我可以将大部分代码移至服务层。

最佳答案

像这样怎么样:

filter: any;
onSortReceived(sort)
{
    if (sort === 'alphabetical')
    {
        this.filter = (a, b) => a.name.last.localeCompare(b.name.last);
    }
    else if (sort === 'reverse alphabetical')
    {
         this.filter = (a, b) => b.name.last.localeCompare(a.name.last);
    }
    else if (sort === 'id')
    {
         this.filter = (a, b) => b._id.localeCompare(a._id);
    }
    else if (sort === 'reset') 
    {
           this.filter = undefined;
    }

    this.filtersService.getByFilter(this.page, this.pagesize, this.body)
    .subscribe(resRecordsData => {
        this.records = resRecordsData;
        this.data = resRecordsData.data;
        this.data.sort(this.filter);
    },
    responseRecordsError => this.errorMsg = responseRecordsError);
}

然后您可以根据需要更轻松地将代码移至服务中。

注意:此代码未经语法检查或测试。

关于javascript - 由于 Observable 订阅发生在组件上,因此我很难将逻辑重构到 Angular 2 应用程序的服务层中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45720288/

相关文章:

typescript - awesome-typescript-loader 仅加载/编译引用文件

typescript - 如何通过 http 请求使用 Observables 在 native 脚本( typescript )上强制使用 UI "refresh"?

javascript - 使用不同的对象作为全局对象评估字符串

angular - SystemJS 6.x 设置/注册模块或在动态加载模块时提供映射

typescript - 在接口(interface) typescript 中支持静态和非静态方法

android - 按键事件在 Android 设备中不起作用

css - 如何删除 Angular 应用程序中的默认边距?

javascript - 使用 "WebMethod"调用 C# 方法返回 "undefined"

javascript - .getElementsByClassName()[]——我不明白什么?

javascript - Rails 4 上的 TinyMCE, Assets 管道不适合我