angular - 如何将数据或警报消息从服务传递回组件
问题描述
我正在使用 Angular 6,我在 3 个不同的屏幕(3 个不同的组件)上有上传文件控件,它们都调用相同的方法 UploadFile() 但问题是每当我必须对此方法进行任何更改时,我都必须更新这种方法在所有 3 个地方。所以,我想用这个方法 UploadFile() 创建一个服务(非共享),这样我就必须在一个地方进行更改并被所有 3 个屏幕调用。我有一个挑战,即如何返回警报消息以及如何将来自该服务内的另一个服务的成功、失败响应返回给组件。
@Injectable({
providedIn: 'root'
})
export class MyFileUploader {
fileuploadList: EventUpload[];
eventId: Number;
constructor(private dateFormatHelper: DateFormatHelper, private manageService: ManageService) {
}
public UploadFile(event) {
const fileList: FileList = event.target.files;
if (fileList.length > 0) {
const file: File = fileList[0];
const extension = fileList[0].name.split('.').pop();
if (this.fileuploadList.find( f => f.fileName === file.name)) {
alert('Duplicate file identified!');
return;
}
const formData: FormData = new FormData();
const params = Object.assign({}, {
Id: 0,
F ileName: file.name,
FilePath: 'XXXXXX',
});
formData.append('uploadFile', file, params.FileName);
formData.append('data', JSON.stringify(params));
this.manageService.uploadAttachments(formData).subscribe (resp => {
if (resp === -1 ) {
alert('Error occured while uploading the attachment');
return;
} else {
this.fileuploadList.push (new DataUpload (0, params.FileName,
params.CreatedBy,));
}
},
(error) => {
console.log('POST ERROR in method uploadAttachments: ' + error.error);
}
);
}
}
}
解决方案
您的UploadFile
方法可以返回一个主题。像这样的东西:
public UploadFile(event) {
const uploadSubject: Subject<any> = new Subject();
const fileList: FileList = event.target.files;
像这样导入:
import { Subject } from 'rxjs';
并像这样使用它:
if (this.fileuploadList.find( f => f.fileName === file.name)) {
alert('Duplicate file identified!');
uploadSubject.next('Duplicate');
uploadSubject.complete();
}
在调用方:
this.myFileUploaderService.UploadFile(event)
.subscribe(
(response) => console.log(response),
(error) => console.error(error),
() => console.log('completed')
)
每次调用 UploadFile 方法时,您都可以订阅 Subject 以接收来自 Service 的信息。
推荐阅读
- html - Mac 与 Windows 上的 Chrome 的 rem 计算在字体大小和行高之间的差异?
- c# - 从datagridview c#加载图像
- go - golang中值类型/指针类型的区别
- php - 我无法用 php 更新我的数据库
- javascript - 使用新的浏览器窗口来控制/显示父窗口上的元素
- java - 使用 Apache Spark 更新一个巨大的文本文件
- android - Android:以低质量拍照
- javascript - 分配包含“id”的ajax html响应内容不能被触发?
- abap - 从 DB 中选择畅销书
- linux-from-scratch - 在 LFS 上对 libffi 的测试失败