角度 2 - 在 div 单击时,将对象传递给另一个组件,另一个组件使用该对象调用休息服务

Posted

技术标签:

【中文标题】角度 2 - 在 div 单击时,将对象传递给另一个组件,另一个组件使用该对象调用休息服务【英文标题】:angular 2 - on div click, pass object to another component and another component uses that object to call rest service 【发布时间】:2017-10-30 09:23:21 【问题描述】:

在父组件(ParentComponent)上加载所有父数据的onInit方法。现在,如果我单击单个父级,它会通过将 parentId 从 ParentComponent 传递给 ParentDetailComponent 来触发子视图,并且 ParentDetailComponent 调用 ParentDetailService 并获取 IParent 对象。现在我尝试使用 *ngIf 来显示 ParentDetailComponent 模板,但它没有触发。如何触发子视图?

子模板:

<div *ngIf="DetailIsVisible" id="detailModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;  </button>
            <h4 class="modal-title" id="myModalLabel">Parent Detail</h4>
        </div>
        <div class="modal-body">
            <div *ngIf="parent">
                <h2>parent.name details!</h2>
                <div><label>id: </label>parent.Id</div>
                <div>
                    <label>name: </label>
                    <label>parent.name</label>
                </div>
                <div>
                    <label>Education: </label>
                    <label>parent.education</label>
                </div>
            </div>
        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default" (click)="hideDetail()">Close</button>
        </div>
    </div>
</div>

子组件:

@Component(
selector: 'app-parent-detail',
templateUrl: './child.component.html',
providers: [ParentDetailService]
)
export class ParentDetailComponent
parentId: string;
parent: IParent;
public DetailIsVisible: boolean;

constructor(private _parentDetailService: ParentDetailService) 


show(parentId: string) 
    this.serviceDetail = serviceId;
 this._parentDetailService.getParentServiceDetail(this.parentId).subscribe(parent => 
        this.parent = parent[0];
        console.log(this.parent);
    );



hideDetail() 
    this.DetailIsVisible = false;

父模板:

div class="container">
<div class="row">
    <div class="col-sm-4" *ngFor="let parent of parents" (click)="selectedServiceDetail(parent.Id)" data-target="#detailModal">
        <div class="panel panel-primary" >
            <div class="panel-heading">parent.Id</div>
            <div class="panel-body"><img [src]="parent.thumbnailpath"
                                         class="img-responsive" style="width:100%; height: 200px" [title] = 'parent.name' ></div>
            <div class="panel-footer">parent.name</div>
        </div>
    </div>
</div>

父组件:

 @Component(
selector: 'app-parent',
templateUrl: './parent.component.html',
providers: [ParentDetailService]
 )
 export class ParentComponent implements OnInit 
/**all rest api and assign to array of catalog*/

     public parents: IParent[];
     public DetailIsVisible: boolean;
     @ViewChild(ParentDetailComponent) detailModal: ParentDetailComponent;

constructor(private _parentService: ParentService) 


ngOnInit(): void 
    this._parentService.getParents()
        .subscribe(
            parents => this.parents = parents
        );
    this.detailModal.DetailIsVisible = false;


    public selectedServiceDetail(parentId): void 

    this.detailModal.DetailIsVisible = true;
    this.detailModal.show(parentId); ---> this triggers ChildComponent method to fetch parent detail service

【问题讨论】:

你可以在 andgular2 中使用@Output eventemitter 你可以从这个问题的答案中找到帮助***.com/questions/36076700/… 【参考方案1】:

你可以使用 mdDialog。

 openNewDetailModal(productObj: any): void 
            const dialogRef = this.dialog.open(DetailsComponent);
            dialogRef.componentInstance.album = this.selectedAlbumObj;
            dialogRef.afterClosed().subscribe(
                (result: boolean) => 
                   // do anything after close modal
                );

还可以在此处查看更多详细信息 click 这有帮助吗!

【讨论】:

【参考方案2】:

您必须为此@Input [在您的详细组件中] 使用事件发射器,该值将从产品页面传递。 这会将产品链接到他们的详细信息页面,然后详细信息页面将接受输入,并在其 ngOnInit 上调用将加载详细信息的 Service 方法。

所有这些都必须在模态中完成,即如果您愿意,可以使用角材料,这将解决您的问题。

https://material.angular.io/components/component/dialog

如果你有一个 plunker 或为此问题尝试过一些东西,请更新 .

【讨论】:

我已经更新了我的问题,您现在可以查看一下吗?我现在卡在哪里可能会更清楚。【参考方案3】:

上述解决方案对我有用。问题是 CSS。我创建了自己的 css 类来获得弹出窗口的感觉

【讨论】:

以上是关于角度 2 - 在 div 单击时,将对象传递给另一个组件,另一个组件使用该对象调用休息服务的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MVC 在将对象传递给视图时倾向于将对象转换为数组?

显示时将对象传递给模态

将对象传递给 UICollectionViewCell

创建/更新实体时,我应该将对象传递给业务逻辑还是对象值?

尝试将对象传递给活动时得到nullpointer

React:将对象传递给状态