gpt4 book ai didi

Angular 4 - 将对象从一个组件传递到另一个组件(无父子层次结构)

转载 作者:太空狗 更新时间:2023-10-29 17:17:43 25 4
gpt4 key购买 nike

我的情况:

我有一个显示图 block 的组件,每个图 block 代表一个数组中的一个对象,该数组用 ngfor 循环。单击图 block 时,我想将该对象传递给另一个组件,该组件负责在可修改的字段中显示该对象的所有属性。

我尝试过的:

在做了一些研究并看到多个帖子向我展示了如何为父子层次结构实现这一点以及一些解释有必要使用共享服务以实现所需功能的帖子后,我决定尝试并设置这样的服务。

但是,我似乎没有明白什么时候应该导航到不同的路线。似乎导航找到位置很早,因为在详细信息组件中检索传递给服务的对象是未定义的。

我的代码:

显示图 block 的组件具有以下功能,可将单击的对象传递给共享服务:

editPropertyDetails(property: Property) {
console.log('Edit property called');

return new Promise(resolve => {
this.sharedPropertyService.setPropertyToDisplay(property);
resolve();
}).then(
() => this.router.navigate(['/properties/detail'])
)
}

共享服务有一个设置属性对象的函数和一个检索它的函数,如下所示:

@Injectable()
export class SharedPropertyService {
// Observable
public propertyToDisplay = new Subject<Property>();

constructor( private router: Router) {}

setPropertyToDisplay(property: Property) {
console.log('setPropertyToDisplay called');
this.propertyToDisplay.next(property);
}

getPropertyToDisplay(): Observable<Property> {
console.log('getPropertyToDisplay called');
return this.propertyToDisplay.asObservable();
}
}

最后是细节组件,它必须接收被点击的对象但得到一个 undefined object :

export class PropertyDetailComponent implements OnDestroy {

property: Property;
subscription: Subscription;

constructor(private sharedPropertyService: SharedPropertyService) {
this.subscription = this.sharedPropertyService.getPropertyToDisplay()
.subscribe(
property => { this.property = property; console.log('Detail Component: ' + property.description);}
);
}

ngOnDestroy() {
// When view destroyed, clear the subscription to prevent memory leaks
this.subscription.unsubscribe();
}
}

提前致谢!

最佳答案

我解决了这个问题,方法是传递被点击的瓦片对象的 ID,就像在路线的导航附加中一样,然后使用详细信息组件中的服务根据通过路线传递的 ID 获取对象。

我将在下面提供代码,希望没有人再经历所有这些。

显示方 block 的组件,可以单击这些方 block 以查看其中包含的对象的详细信息:

  editPropertyDetails(property: Property) {
console.log('Edit property called');

let navigationExtras: NavigationExtras = {
queryParams: {
"property_id": property.id
}
};

this.router.navigate(['/properties/detail'], navigationExtras);
}

接收被点击对象的详情组件

  private sub: any;
propertyToDisplay: Property;

constructor
(
private sharedPropertyService: SharedPropertyService,
private router: Router,
private route: ActivatedRoute
) {}

ngOnInit() {
this.sub = this.route.queryParams.subscribe(params => {
let id = params["property_id"];

if(id) {
this.getPropertyToDisplay(id);
}

});
}

getPropertyToDisplay(id: number) {
this.sharedPropertyService.getPropertyToDisplay(id).subscribe(
property => {
this.propertyToDisplay = property;
},
error => console.log('Something went wrong'));
}

// Prevent memory leaks
ngOnDestroy() {
this.sub.unsubscribe();
}

服务

  properties: Property[];

constructor( private propertyService: PropertyService) {}

public getPropertyToDisplay(id: number): Observable<Property> {
if (this.properties) {
return this.findPropertyObservable(id);
} else {
return Observable.create((observer: Observer<Property>) => {
this.getProperties().subscribe((properties: Property[]) => {
this.properties = properties;
const prop = this.filterProperties(id);
observer.next(prop);
observer.complete();
})
}).catch(this.handleError);
}
}

private findPropertyObservable(id: number): Observable<Property> {
return this.createObservable(this.filterProperties(id));
}

private filterProperties(id: number): Property {
const props = this.properties.filter((prop) => prop.id == id);
return (props.length) ? props[0] : null;
}

private createObservable(data: any): Observable<any> {
return Observable.create((observer: Observer<any>) => {
observer.next(data);
observer.complete();
});
}

private handleError(error: any) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}

private getProperties(): Observable<Property[]> {
if (!this.properties) {
return this.propertyService.getProperties().map((res: Property[]) => {
this.properties = res;
console.log('The properties: ' + JSON.stringify(this.properties));
return this.properties;
})
.catch(this.handleError);
} else {
return this.createObservable(this.properties);
}
}

关于Angular 4 - 将对象从一个组件传递到另一个组件(无父子层次结构),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47471726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com