我是Angular的新用户!到目前为止,我喜欢但在以下情况下遇到一些困难。我想一旦用户单击数据表中带有 href 标签的特定单元格,就将数据从一个组件发送到另一组件。因此,我创建了以下.ts文件
service.ts
import { Injectable } from '@angular/core';
import { HttpClient,HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
import { BehaviorSubject } from 'rxjs';
@Injectable()
export class MyService {
private protDataSource = new BehaviorSubject<any>({
currentprotData:null
});
currentprotData= this.protDataSource.asObservable();
constructor(
private http: HttpClient
) {}
sendProtData(currentprotData:any){
console.log(currentprotData)
this.protDataSource.next(currentprotData);
}
get(url){
return this.http.get(url)
.pipe(
map(responce=>responce),
catchError(this.handleError)
)
}
}
sender.ts
import { Component, OnInit, OnDestroy, ViewChild, Renderer } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { DataTableDirective } from 'angular-datatables';
import { HttpClient,HttpErrorResponse } from '@angular/common/http';
import { Subject } from 'rxjs';
import { MyService } from '../qmpkb/qmpkb.service';
declare var jquery: any;
@Component({
selector: 'app-sender-page',
templateUrl: './sender.component.html',
styleUrls: ['./sender.component.css'],
providers:[MyService]
})
export class SenderComponent implements OnInit,OnDestroy {
dtOptions: DataTables.Settings = {};
dtTrigger: Subject<any> = new Subject();
private routeSub:any;
errorStr:Boolean;
@ViewChild(DataTableDirective)
datatableElement: DataTableDirective;
constructor(
private route: ActivatedRoute,
private http: HttpClient,
private renderer: Renderer,
private router: Router,
private _myserve:MyService
) { }
ngOnInit(): void {
//let destPath='fileapi/resultFile/jsonData/resultJson/'+this.queryResPath
let destPath='assets/json/fake.json'
this.dtOptions = {
pagingType: 'full_numbers',
ajax: destPath,
processing: true,
serverSide: false,
columns: [
{
title: 'Prot Seq',
render: function (data: any, type: any, row: any, meta) {
if (row["Prot Seq"].trim().length > 0 ){
var array =(row["Prot Seq"].trim()).split('<br>');
array.forEach(function(element, index) {
array[index] ='<a target="_blank" href="/seqfeatures" routerLinkActive="active" seq-link-id=' + element+'>'+element+'</a>';
});
return array.join("<br>");
} else {
return 'No';
}
}
}
]
};
}
ngAfterViewInit(): void {
this.renderer.listenGlobal('document', 'click', (event) => {
if (event.target.hasAttribute("seq-link-id")) {
this._qmpkb.get(url).subscribe((response: any)=>{
this._myserve.sendProtData(response);
}, error=>{
this.errorStr = error;
})
}
})
}
ngOnDestroy(){
this.routeSub.unsubscribe();
this.dtTrigger.unsubscribe();
}
}
receiver.ts
import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { HttpClient,HttpErrorResponse } from '@angular/common/http';
import { MyService } from '../qmpkb/qmpkb.service';
declare var require: any
@Component({
selector: 'app-prot-view',
templateUrl: './prot-view.component.html',
styleUrls: ['./prot-view.component.css'],
providers:[MyService]
})
export class ProtViewComponent implements OnInit,OnDestroy {
message:string
constructor(
private route: ActivatedRoute,
private http: HttpClient,
private router: Router,
private _myserve:MyService,
) { }
ngOnInit() {
this._myserve.currentprotData.subscribe(currentprotData=>{
this.message=currentprotData
})
}
ngAfterViewInit(): void {
console.log(this.message)
}
ngOnDestroy(){
}
}
我的服务可以接收数据,但接收方始终将null重新运行。我很想知道这里出了什么问题!非常感谢您的帮助和建议!
已更新 正如DeborahK建议在stackblitz中包含项目的一部分!您可以检查我如何构建此项目!
答案 0 :(得分:1)
问题很少。简单的方法是,如果您在sendProtData().subscribe
中订阅receiver.ts
,那是错误的。您需要订阅BehaviorSubject
,并且sendProtData()
也具有没有返回类型。
将protDataSource
设为公开并订阅。
public protDataSource = new BehaviorSubject<any>({
currentprotData:null
});
,然后在 receiver.ts 中:
ngOnInit() {
this._myserve.protDataSource.subscribe(currentprotData=>{
this.message=currentprotData
})
这样做就可以了。
更新:
我固定了以下内容以使其起作用:
您不应使用provider:[]
@Component
注入服务。 It creates a new instance of service for each component.。您不需要那。您需要两个组件共享同一个服务实例才能共享数据。因此,请在@NgModule
app.module.ts
在演示代码中,没有<app-receiver></app-receiver>
。我也添加了它,以便启动组件。
我希望它可以帮助:)。感谢您创建演示
答案 1 :(得分:0)
尝试移动console.log:
代替此:
ngOnInit() {
this._myserve.sendProtData.subscribe(currentprotData=>{
this.message=currentprotData
})
}
ngAfterViewInit(): void {
console.log(this.message)
}
尝试一下:
ngOnInit() {
this._myserve.sendProtData.subscribe(currentprotData=>{
this.message=currentprotData;
console.log(this.message);
})
}