当前位置: 首页 > 知识库问答 >
问题:

将对象检测从一个组件改为另一个组件

孟华晖
2023-03-14

嗨,我有一个对象,它正在使用一个组件中的可观察到的东西从api更新,我想捕获同一对象对另一个组件的更改。这两个组件都是两个选项卡。最初是根据路由更新数据。以下是正在更新的数据:

@Component({
    template : `<div><input type='text' [(ngModel)]='data.name' /></div>`
})
export class ComponentOne{

    data : any;
    constructor(private dataService : DataService,
        private route : ActivatedRoute,private events : Events){
        this.data = this.route.snapshot.data['data'];
    }
    updateData(){
        this.dataService.update(this.data).subscribe(result => {
            this.data = result;
            this.events.publish('data',this.data);
        })
    }
}

我在这里捕获数据:

@Component({
    template : `<div>{{data.name}}</div>`
})
export class ComponentTwo{
    data : any;
    constructor(private dataService : DataService,
        private route : ActivatedRoute,private events : Events){
        this.data = this.route.snapshot.data['data'];
    }

    ngViewDidEnter(){
        //why updated data not coming from server
        this.data = this.route.snapshot.data['data'];
        this.events.subscribe('data',(data) => {
            this.data = data;
        })
    }
}

componentTwo中,数据最初是从路由获取的。考虑到上述情况,我有两个问题:

  1. 如果应用程序有多个组件,我想我必须在每个组件中subscribe事件,这将是一个很好的做法。请提出任何替代方法?
  2. 由于数据来自服务器,为什么不从ComponentTwo中的This.Route.Snapshot.data['data']获取更新的数据?

共有1个答案

冯新知
2023-03-14

由于它们在任何方面都不相关,因此您应该使用共享服务。

首先创建一个服务,并向其添加主题

export class SharingService {
  data: Subject<any> = new Subject();
}

在第一个组件中,您将更新数据并将其传递给主题

updateData(){
    this.dataService.update(this.data).subscribe(result => {
        this.data = result;
        this.sharingService.data.next(data);
        this.events.publish('data',this.data);
    })
}

在第二个服务中,您现在可以订阅更改事件:

constructor(
    private dataService : DataService,
    private route : ActivatedRoute,
    private events : Events,
    private sharingService: SharingService
){
    sharingService.subscribe(data => this.data = data);
}

并不是说必须实例化两个选项卡才能使其工作。如果不是,则必须使用BehaviorSubject:

data: BehaviorSubject<any> = new BehaviorSubject(undefined);
 类似资料:
  • 问题内容: 我有两个组成部分。我想从第二个组件中调用第一个组件的方法。我该怎么做? 这是我的代码。 第一部分 第二部分 问题答案: 你可以做这样的事情 使用静态

  • 问题内容: 许多模板语言都有“ slots”或“ yield”语句,它们允许进行某种形式的控制反转,以将一个模板包装在另一个模板中。 Angular具有“ transclude”选项。 Rails有收益声明。如果React.js拥有yield语句,它将看起来像这样: 所需的输出: React,React.js没有。如何定义包装器组件以实现相同的输出? 问题答案: 尝试: 有关更多信息,请参见文档中

  • 许多模板语言都有“slots”或“yield”语句,它们允许进行某种形式的控制反转,将一个模板包装在另一个模板中。 唉,react.js没有。我如何定义包装器组件以实现相同的输出?

  • 我有一个产品组件,我希望将其图片传递给另一个组件,我的图片从Rails后端上传,并映射产品详细信息。我想实现的是,当您单击按钮时,您的产品图片将显示在设计页面中进行自定义设计。 设计页面当您单击设计我按钮时,根据产品,该产品的图片应该出现在设计页面中 陈列

  • 问题内容: 我有一个包含一个按钮的标题组件,并且我希望该按钮在单击时显示另一个组件(模式页面)。 我可以做这样的事情: 这是我的标头组件: 这是我的模态页面组件,单击其他组件上的按钮时应显示该组件页面: 用于模态的库:https : //github.com/marcio/react-skylight 问题答案: 更像这样: 确保在子组件上公开一个方法: 基本上,这是在将SkyLight的方法包装

  • 问题内容: 我有两个对象数组。我想基于PermissionObj过滤数据。 这是即将形成的数据库。这是permissionObj中的子数组的数组。 这是静态数据。我想比较基于PermissionObj的数据。 我正在尝试基于 对象 的 PermissionObj数组 过滤 对象 的 数据数组 。这是我尝试的代码。 如果PermissionObj值将与data值匹配。然后显示数据。 我接受的输出将是