当前位置: 首页 > 面试题库 >

JavaScript Angular 2同级组件通信

宋涵衍
2023-03-14
问题内容

我有一个ListComponent。在ListComponent中单击某个项目时,该项目的详细信息应显示在DetailComponent中。两者同时显示在屏幕上,因此不涉及路由。

如何告诉DetailComponent单击ListComponent中的哪个项目?

我考虑过向父对象(AppComponent)发出事件,并让父对象使用@Input在DetailComponent上设置selectedItem.id。或者,我可以将共享服务与可观察的订阅一起使用。

编辑:通过事件+ @Input设置所选的项目不会触发DetailComponent,但是,以防万一我需要执行其他html" target="_blank">代码。因此,我不确定这是否是可接受的解决方案。

但是,这两种方法似乎都比通过Angular 1做事方式复杂得多,后者是通过$ rootScope。$ broadcast或$ scope。$ parent。$ broadcast实现的。

由于Angular 2中的所有内容都是组件,我很惊讶没有更多有关组件通信的信息。

是否有另一种/更直接的方法来完成此任务?


问题答案:

更新到rc.4: 当试图使数据在angular 2的兄弟组件之间传递时,目前最简单的方法(angular.rc.4)是利用angular2的分层依赖注入并创建共享服务。

这将是服务:

import {Injectable} from '@angular/core';

@Injectable()
export class SharedService {
    dataArray: string[] = [];

    insertData(data: string){
        this.dataArray.unshift(data);
    }
}

现在,这里是PARENT组件

import {Component} from '@angular/core';
import {SharedService} from './shared.service';
import {ChildComponent} from './child.component';
import {ChildSiblingComponent} from './child-sibling.component';
@Component({
    selector: 'parent-component',
    template: `
        <h1>Parent</h1>
        <div>
            <child-component></child-component>
            <child-sibling-component></child-sibling-component>
        </div>
    `,
    providers: [SharedService],
    directives: [ChildComponent, ChildSiblingComponent]
})
export class parentComponent{

} 

及其两个孩子

儿童1

import {Component, OnInit} from '@angular/core';
import {SharedService} from './shared.service'

@Component({
    selector: 'child-component',
    template: `
        <h1>I am a child</h1>
        <div>
            <ul *ngFor="#data in data">
                <li>{{data}}</li>
            </ul>
        </div>
    `
})
export class ChildComponent implements OnInit{
    data: string[] = [];
    constructor(
        private _sharedService: SharedService) { }
    ngOnInit():any {
        this.data = this._sharedService.dataArray;
    }
}

孩子2(同级)

import {Component} from 'angular2/core';
import {SharedService} from './shared.service'

@Component({
    selector: 'child-sibling-component',
    template: `
        <h1>I am a child</h1>
        <input type="text" [(ngModel)]="data"/>
        <button (click)="addData()"></button>
    `
})
export class ChildSiblingComponent{
    data: string = 'Testing data';
    constructor(
        private _sharedService: SharedService){}
    addData(){
        this._sharedService.insertData(this.data);
        this.data = '';
    }
}

现在:使用此方法时要注意的事项。

  1. 仅在PARENT组件中包括共享服务的服务提供者,而不在子组件中。
  2. 你仍然必须包括构造函数并将服务导入子项中
  3. 此答案最初是针对早期的angular 2 beta版本回答的。尽管所有更改都不过是import语句,所以如果你偶然使用了原始版本,则只需更新即可。


 类似资料:
  • 问题内容: 总览 在Vue.js2.x中,将不推荐使用。 那么,在[Vue.js2.x中的]兄弟组件之间进行通信的正确方法是什么? 背景 据我了解Vue 2.x,同级通信的首选方法 是使用商店或事件总线 。 根据Evan(Vue的创建者)的说法: 值得一提的是,“在组件之间传递数据”通常不是一个好主意,因为最终数据流变得不可跟踪且很难调试。 如果一条数据需要由多个组件共享,则首选全局存储或Vuex

  • 问题内容: 我是React的新手,我想问一个战略问题,关于如何最好地完成必须在同级组件之间传递数据的任务。 首先,我将描述任务: 假设我有多个组件,它们是一个单亲的子代,它们通过数组动态地向下传递选择框。每个框在其初始状态下具有完全相同的可用选项,但是一旦用户在一个框中选择了某个特定选项,则必须将其作为所有其他框中的选项禁用,直到将其释放。 这是(傻)代码中的相同示例。(我用作创建选择框的简写。)

  • 有一个父组件 A,上面有两个子组件,B 和 C。 在子组件 B 上有一个子组件 D,其中 D 里面有一个 textarea 在子组件 C 上有一个按钮,点击这个按钮获取 D 里面 textarea 的值。 我尝试的两个方案 方案一:可以通过直接操作 dom 来解决 方案二:通过 D 将 textarea 的值传递给 B,然后由 B 传给 A,再有 A 传给 C,但总是传不成功。 请问我的这个需求,

  • 我的反应结构是 在中有一个按钮,单击该按钮可通过家长向其兄弟姐妹发送消息。第一个孩子- 应用程序 选择研究 参与者表-这需要接收某个变量,例如在其状态中的

  • 现在我们熟悉了组件基础知识,可以做一些更有趣的事情。

  • 哪里需要从同级组件访问元素,但不需要从父 Cmp 访问元素。 例: 需要组件 B 的 templateA 中的 iframe 元素来隐藏 或删除该元素。 index.html ComponentA.html @组件 @组件