使用Angular服务为Ajax数据表在组件之间共享数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Angular服务为Ajax数据表在组件之间共享数据相关的知识,希望对你有一定的参考价值。
我是Angular的新人!到目前为止,我已经喜欢但在以下情况下面临一些困难。一旦用户在Datatables中单击带有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中包含项目的一部分!您可以查看我是如何构建此项目的!
答案
问题很少。如果你在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
})
这就是诀窍。
更新:
我修复了以下内容以使其工作:
- 你不应该使用qazxsw poi qazxsw poi注入服务。 qazxsw poi。你不需要那个。您需要两个组件共享相同的服务实例才能共享数据。所以,在
provider:[]
注入@Component
- 在演示代码中,没有It creates a new instance of service for each component.。我也补充说,以便启动组件。
我希望它有帮助:)。感谢您创建演示
另一答案
尝试移动console.log:
而不是这个:
@NgModule
试试这个:
app.module.ts
以上是关于使用Angular服务为Ajax数据表在组件之间共享数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 Typescript 在 Angular 2 中的组件之间共享行为