首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在角5中具有rxjs的持久订阅

在角5中具有rxjs的持久订阅
EN

Stack Overflow用户
提问于 2018-03-15 10:48:31
回答 3查看 2.5K关注 0票数 2

对于第5角的rxjs,我还是有点陌生,很难提出我的问题。不过,我还是希望得到一些建议。

我常常以同样的设置结束:

  • 显示相同数据的多个组件
  • 访问数据的单个服务

现在,在通过可观测数据接收数据时,我有两个选择:

( a)订阅可观察到的数据一次,再订阅一次以获取更新

( b)订阅可观察到的内容,并在数据更改时始终获得更新

( a)直截了当,但对于b)我经常遇到麻烦,不知道这是否是使用可观察的正确方法。

一个问题是,在某些情况下,取消订阅变得非常重要,而缺少取消订阅会导致在每次更新可观察到的内容时执行严重的垃圾。

另一方面,使用选项a),当另一个组件正在更新底层数据时,我可能会错过一个组件中的一些更新。

有什么最佳做法来避免所有这些陷阱吗?

EN

回答 3

Stack Overflow用户

发布于 2018-03-15 11:12:40

听起来,您想要弄清楚的概念是如何在使用RxJS时调整订阅管理。在这方面,有三个主要的选择:

  1. 使用async管道自动创建和删除订阅。如果您希望严格基于从可观察对象发出的数据进行UI更改,那么async管道将在创建组件时轻松地创建对给定可观测对象的订阅,并在组件被销毁时删除这些订阅。这可以说是使用订阅的最干净的方式。

例如:

代码语言:javascript
运行
AI代码解释
复制
@Component({
    selector: 'my-component',
    template: `
        <div *ngFor="let value of value$ | async">
            {{value}}
        </div>
    `
})
export class MyComponent {
    public value$: Observable<String> = this.myValueService
        .getValues()
        .map(value => `Value: $value`);
    constructor(myValueService: MyValueService) {}
}
  1. 通过在Subscription方法中创建类级ngOnInit对象,然后在ngOnDestroy方法中取消订阅,来管理组件中的订阅。当我需要访问组件代码中的订阅时,我倾向于这样做。在每个使用订阅的组件中使用ngOnInitngOnDestroy方法都会添加样板,但如果您需要在组件代码中订阅,则通常是必要的。

例如:

代码语言:javascript
运行
AI代码解释
复制
@Component({
    selector: 'my-component',
    template: `
        <div #myDiv></div>
    `
})
export class MyComponent implements OnInit, OnDestroy {
    private mySub: Subscription;
    constructor(myValueService: MyValueService) {}

    public ngOnInit() {
        this.mySub = this.myValueService.getValue().subscribe((value) => {
            console.log(value);
            // Do something with value
        });
    }
    public ngOnDestroy() {
        this.mySub.unsubscribe();
    }
}
  1. 使用限制操作(如first() )限制订阅寿命。这是默认情况下,当您启动对HttpClient可观察性的订阅时所做的事情。这样做的好处是不需要多少代码,但也可能导致订阅未被清除的情况(例如,如果可观察到的代码从未发出)。

如果我想用一个可观察的东西做的所有事情都可以在视图中完成,那么我实际上总是使用选项1。在我的经验中,这涵盖了大多数情况。您始终可以使用中间可观察性来生成一个可观察的,如果需要的话,可以在视图中订阅。中间可观测值不会引起内存泄漏问题。

票数 2
EN

Stack Overflow用户

发布于 2018-03-15 10:54:17

另一种选择是使用可观测数据来检索数据,然后让角度变化检测处理其余的数据。随着角度的变化检测,它将更新UI的数据变化.没有必要再次订阅以获得更新。

例如,我有这种类型的UI:

我使用Http和一个可观察到的方法检索数据。但是,我利用角的变化检测来处理任何更新。

这是我的一份服务:

代码语言:javascript
运行
AI代码解释
复制
@Injectable()
export class MovieService {
    private moviesUrl = 'api/movies';
    private movies: IMovie[];

    currentMovie: IMovie | null;

    constructor(private http: HttpClient) { }

    getMovies(): Observable<IMovie[]> {
        if (this.movies) {
            return of(this.movies);
        }
        return this.http.get<IMovie[]>(this.moviesUrl)
                        .pipe(
                            tap(data => console.log(JSON.stringify(data))),
                            tap(data => this.movies = data),
                            catchError(this.handleError)
                        );
    }

    // more stuff here
}

下面是上面右边显示的细节组件的完整代码(导入除外):

代码语言:javascript
运行
AI代码解释
复制
export class MovieDetailComponent implements OnInit {
    pageTitle: string = 'Movie Detail';
    errorMessage: string;

    get movie(): IMovie | null {
        return this.movieService.currentMovie;
    }

    constructor(private movieService: MovieService) {
    }

    ngOnInit(): void {
    }
}

您可以在这里看到完整的示例(带有编辑):https://github.com/DeborahK/MovieHunter-communication/tree/master/MH-Take5

票数 1
EN

Stack Overflow用户

发布于 2018-03-15 11:33:36

在组件之间传递数据时,我发现RxJS BehaviorSubject非常有用。

您也可以使用常规的RxJS Subject来通过服务共享数据,但下面是我更喜欢BehaviorSubject的原因。

  1. 它总是在订阅时返回当前值--不需要调用onnext()。
  2. 它有一个getValue()函数来提取最后一个值作为原始数据。
  3. 它确保组件始终接收最新的数据。
  4. 您可以使用关于行为主题的asobservable()方法从行为主题中获得可观察的结果。
  5. Refer this for more

示例

在服务中,我们将创建一个私有BehaviorSubject,它将保存消息的当前值。我们定义了一个currentMessage变量来处理这个数据流,作为其他组件将使用的一个可观察的数据流。最后,我们创建了一个函数,该函数调用BehaviorSubject上的next来更改其值。

父组件、子组件和同级组件都得到相同的待遇。我们将DataService注入组件中,然后订阅可观察到的currentMessage,并将其值设置为等于消息变量。

现在,如果我们在这些组件中的任何一个中创建一个函数来更改消息的值。更新后的值将自动广播到所有其他组件。

shared.service.ts

代码语言:javascript
运行
AI代码解释
复制
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

@Injectable()
export class SharedService {

  private messageSource = new BehaviorSubject<string>("default message");
  currentMessage = this.messageSource.asObservable();

  constructor() { }

  changeMessage(message: string) {
    this.messageSource.next(message)
  }

}

parent.component.ts

代码语言:javascript
运行
AI代码解释
复制
import { Component, OnInit } from '@angular/core';
import { SharedService } from "../shared.service";

@Component({
  selector: 'app-sibling',
  template: `
    {{message}}
    <button (click)="newMessage()">New Message</button>
  `,
  styleUrls: ['./sibling.component.css']
})
export class SiblingComponent implements OnInit {

  message: string;

  constructor(private service: sharedService) { }

  ngOnInit() {
    this.service.currentMessage.subscribe(message => this.message = message)
  }

  newMessage() {
    this.service.changeMessage("Hello from Sibling")
  }

}

sibling.component.ts

代码语言:javascript
运行
AI代码解释
复制
import { Component, OnInit } from '@angular/core';
import { SharedService } from "../shared.service";

@Component({
  selector: 'app-sibling',
  template: `
    {{message}}
    <button (click)="newMessage()">New Message</button>
  `,
  styleUrls: ['./sibling.component.css']
})
export class SiblingComponent implements OnInit {

  message: string;

  constructor(private service: SharedService) { }

  ngOnInit() {
    this.service.currentMessage.subscribe(message => this.message = message)
  }

  newMessage() {
    this.service.changeMessage("Hello from Sibling");
  }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49307098

复制
相关文章
html中ul和li的使用_ul列表的html结构
1. 序号可以是数字、字母、罗马数字等,可以通过list-style-type 属性设置。
全栈程序员站长
2022/09/19
3.7K0
html中ul和li的使用_ul列表的html结构
jQuery创建json对象
JSON创建json对象: <!DOCTYPE html> <html>     <head>         <meta charset="utf-8">         <title>创建json对象方法一</title>     </head>     <body>         <ul>             <li>姓名:<span class="name"></span></li>             <li>年龄:<span class="age"></span></li>     
凯哥Java
2022/12/16
2.1K0
jQuery创建json对象
用值填充JavaScript数组的几种方法
通过将点扩展符与数组实例的 keys 方法结合使用,我们可以从0开始以升序数填充数组。
张张
2020/04/21
2.6K0
用值填充JavaScript数组的几种方法
使用json 和jQuery制作级联dropdownlist
联动式的下拉选择是一个很普遍的需求,在ASP.NET MVC中可以使用Json和jQuery来实现,更简单的是使用jQuery的级联插件CascadingDropDown ,具体参见文章http://weblogs.asp.net/rajbk/archive/2010/05/20/cascadingdropdown-jquery-plugin-for-asp-net-mvc.aspx。 1: $(targetID).CascadingDropDown(sourceID, actionPath, set
张善友
2018/01/19
9200
jquery + json 动态创建复杂表格table
function SetSubTable() { var obj = jQuery.parseJSON($("#SubJsonStrValue").val()); window.ALLPARAMTERS = obj; var row_str = ""; var span_num = 1 for (var i = 0; i < obj.length; i++) { if (obj[i].ParamN
liulun
2022/05/09
2.1K0
jQuery 和 json 简单例子(注意callback函数的处理!!) (servlet返回json,jquery更新,java json)
这个例子是后台获取某个目录的所有文件信息,前台网页显示。 代码文件:     http://files.cnblogs.com/kenkofox/jsonTest.html%E5%92%8COnlineFileManagerServlet.rar JSON包(java文件):http://files.cnblogs.com/kenkofox/org.json.rar Servlet: protected void processRequest(HttpServletRequest request,
用户1258909
2018/07/03
8600
dataframe填充缺失值_pandas填充空值
将其Nan全部填充为0,这时再打印的话会发现根本未填充,这是因为没有加上参数inplace参数。
全栈程序员站长
2022/09/22
2.8K0
JS和JQuery获取label的值
label <label name="label_blog" id="label_blog" value="http://blog.ithomer.net"> http://blog.ithomer.net </label> </br> <input name="input_blog" id="input_blog" value="http://blog.ithomer.net"> </input> label 获取值: label标签在JS和Jquery中使用不能像其他标签一样用value获取它
阳光岛主
2019/02/18
9.3K0
jQuery获取checkbox和radio的值
一般获取 input 的值,直接使用 $('input').val() 就可以了。
德顺
2023/08/25
3470
jquery.json插件的方便使用
toJSON: 序列化的JavaScript对象,数字,字符串或数组转换为JSON对象(json转字符串) evalJSON: 转换从JSON为Javascript对象(字符串转对象) secureEvalJSON: Converts from JSON to Javascript, but does so while checking to see if the source is actually JSON, and not with other Javascript statements thrown in. quoteString: Places quotes around a string, and intelligently escapes any quote, backslash, or control characters. quoteString:放置引号的字符串,并智能地转义任何引号,反斜线,或控制字符。 secureEvalJSON:转换从JSON为Javascript,但这样做同时检查,看看源实际上是JSON,而不是与其他的JavaScript语句抛出英寸
李维亮
2021/07/09
1.1K0
Jquery通过JSON和Struts的Action交互
前面写过 《JQuery通过JSON和Servlet进行交互》 ,不过在SSH架构的项目中要是依然在写出一个Servle实在是有点另类的(至少我目前是这么认为的),因此就应该顺势而行,使用Jquery通过JSON和后台Action交互。 具体实现起来和前面的那篇文章差不太多。简明扼要的说一下: 首先配置好struts2的配置文件,定义一个Action名为test,对应的Class为TestAction:
the5fire
2019/02/28
7080
Jquery和PHP Ajax JSON
本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2021/03/22
1.5K0
使用scikit-learn填充缺失值
在真实世界中的数据,难免会有缺失值的情况出现,可能是收集资料时没有收集到对应的信息,也可能是整理的时候误删除导致。对于包含缺失值的数据,有两大类处理思路
生信修炼手册
2021/02/09
2.9K0
asp.net :使用jquery 的ajax +WebService+json 实现无刷新去后台值
首先贴上Jquery的ajax: $.ajax({ url: 'ws_Ajax.asmx/BindDictByUpper', type: 'POST', contentType: 'application/json;charset=utf-8', dataType: 'json', data: '{ PpareId:"' + varlue
hbbliyong
2018/03/05
3.9K0
JavaEE 使用 JQuery 完成 ajax & json 数据的传输
JSONobj 需要的同学,需要 mysql 驱动的,我已经上传至 Github,里面也整理了一些我学习会常用到的 jar包 Jar 包下载链接
Gorit
2021/12/08
1.6K0
JavaEE 使用 JQuery 完成 ajax & json 数据的传输
涉及的键和值的类型都是interface
与原生的字典相同,并发安全字典对键的类型也是有要求的。它们同样不能是函数类型、字典类型和切片类型。另外,由于并发安全字典提供的方法涉及的键和值的类型都是interface{},遴选真题所以我们在调用这些方法的时候,往往还需要对键和值的实际类型进行检查。这里大致有两个方案。我们今天主要提到了第一种方案,这是在编码时就完全确定键和值的类型,然后利用 Go 语言的编译器帮我们做检查。
用户7737280
2021/11/27
7380
Jquery 使用getJSON 获取json数据
1.先引用jq获取下载到本地 CDN地址:https://code.jquery.com/jquery-latest.js
Alone88
2019/10/22
3.6K0
一个简单的Ajax功能(用到Jquery与Json)
效果图: 提示:上面的java学习和许肖飞不是写死的而是从服务器中获取的 1、在index.jsp页面载入jquery-1.8.3.js(放在WebRoot目录下的js文件夹里面) 并且在WebR
Java学习
2018/04/18
1.1K0
一个简单的Ajax功能(用到Jquery与Json)
pandas处理缺失值的函数_pandas填充缺失值
df.dropna()函数用于删除dataframe数据中的缺失数据,即 删除NaN数据.
全栈程序员站长
2022/09/30
2K0
使用jQuery来创建Silverlight
使用jQuery来创建Silverlight jQuery已经成为了VS2010内置支持的JavaScript脚本框架了,小巧实用。这里看看怎么用jQuery来在页面中创建一个Silverlight。( 呵呵,有一种swfobject的感觉了 ) jquery.silverlight.js jQuery.fn.extend({     silverlight: function(opts) {         _opts = jQuery.extend({             background
用户1172164
2018/03/01
9670

相似问题

Python APscheduler并返回目录中最新csv的文件路径

10

返回python中的CSV文件

22

从python子目录提取csv文件。

24

Python -连接特定目录中的CSV文件

21

Python:下载CSV文件,检查返回码?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档