angular - 角度如何在编辑模式下上传图像并将图像检索为字符串?
问题描述
我正在学习使用 Angular 和 asp.net 核心在此链接上使用这些视频构建应用程序- 单元表格,课程 - Felipe Gavilan 的“从计算机中选择图像” - 在 VSCode 上。除了用图像编辑 aa 组件外,一切正常。本教程创建了两个接口(两个模型) - 一个用于以字符串形式检索图像,另一个用于通过上传创建图像。当我运行应用程序时,我收到如下错误,但相同的代码在教程中有效,我不知道为什么
类型“actorDTO”不可分配给类型“actorCreationDTO”属性“图片”的类型不兼容。类型“字符串”不可分配给类型“文件”。<app-form-actor [model]="model" (onSaveChanges)="saveChanges($event)"> src/app/actors/edit-actor/edit-actor.component.ts:7:24 templateUrl: '. /edit-actor.component.html', 组件EditActorComponent的模板出错。
下一行中的错误是由于两个模型接口(1)actorCreationDTO 具有文件类型的“图片”(用于创建和上传图像)和(2)actorDTO 具有字符串类型的“图片”(用于检索编辑模式)
<app-form-actor [model]="model" (onSaveChanges)="saveChanges($event)">
演员.model.ts
export interface actorCreationDTO{
name:string;
dateOfBirth:Date;
picture:File;
biography?:string;
}
export interface actorDTO{
name:string;
dateOfBirth:Date;
picture:string;
biography?:string;
}
form-actor.component.html
<form (submit)="saveChanges()" [formGroup]="form">
<mat-form-field appearance="outline">
<mat-label>Name*</mat-label>
<input formControlName="name" matInput>
<mat-error>The name is required</mat-error>
</mat-form-field>
<mat-form-field appearance="outline">
<mat-label>Date Of Birth</mat-label>
<input formControlName="dateOfBirth" matInput [matDatepicker]="picker">
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>
</mat-form-field>
<h4>Select Picture</h4>
<app-input-img
[urlCurrentImage]="model?.picture" (onImageSelected)="onImageSelected($event)"></app-input-img>
<!-- <app-input-img
(onImageSelected)="onImageSelected($event)"></app-input-img>
-->
<h4>Biography</h4>
<app-input-markdown [markdownContent]="model?.biography" (changeMarkdown)="changeMarkdown($event)"></app-input-markdown>
<div><button mat-flat-button color="primary" [disabled]="form.invalid">Save Changes</button>
<a mat-stroked-button routerLink="/actors" >Cancel</a>
</div>
</form>
form-actor.component.ts
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { actorCreationDTO } from '../actors.model';
@Component({
selector: 'app-form-actor',
templateUrl: './form-actor.component.html',
styleUrls: ['./form-actor.component.css']
})
export class FormActorComponent implements OnInit {
constructor(private formBuilder:FormBuilder) { }
form!:FormGroup;
@Input()
model!:actorCreationDTO;
@Output()
onSaveChanges=new EventEmitter<actorCreationDTO>();
ngOnInit(): void {
this.form=this.formBuilder.group({
name: ['',{
validators:[Validators.required]
}],
dateOfBirth:'',
picture:'',
biography:''
});
if(this.form!==undefined)
{
this.form.patchValue(this.model);
}
}
onImageSelected(image: any){
this.form.get('picture')?.setValue(image);
}
changeMarkdown(content: any){
this.form.get('biography')?.setValue(content);
}
saveChanges(){
this.onSaveChanges.emit(this.form.value);
}
}
创建actor.component.html
<h2>Create Actor</h2>
<app-form-actor (onSaveChanges)="saveChanges($event)"></app-form-actor>
创建actor.component.ts
import { Component, OnInit } from '@angular/core';
import { actorCreationDTO } from '../actors.model';
@Component({
selector: 'app-create-actor',
templateUrl: './create-actor.component.html',
styleUrls: ['./create-actor.component.css']
})
export class CreateActorComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
saveChanges(actorCreationDTO:actorCreationDTO){
console.log(actorCreationDTO);
}
}
编辑actor.component.html
<h2>Edit Actor</h2>
<app-form-actor [model]="model" (onSaveChanges)="saveChanges($event)"></app-form-actor>
编辑actor.component.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { actorCreationDTO, actorDTO } from '../actors.model';
@Component({
selector: 'app-edit-actor',
templateUrl: './edit-actor.component.html',
styleUrls: ['./edit-actor.component.css']
})
export class EditActorComponent implements OnInit {
constructor(private activatedRoute:ActivatedRoute) { }
model:actorDTO ={name: 'Tom Holland',dateOfBirth: new Date(),
picture:'https://www.nme.com/wp-content/uploads/2021/01/Chris-Evans-Captain-America-696x442.jpg',
biography:'default value'
}
ngOnInit(): void {
// this.router.navigate(['edit',id], { relativeTo: this.route });
this.activatedRoute.params.subscribe(params=>
{
// alert(params.id);
});
}
saveChanges(actorCreationDTO:actorCreationDTO){
console.log(actorCreationDTO);
}
}
index-actors.component.html
<h2>Actors</h2>
<button mat-flat-button color="primary" type="button" routerLink="/actors/create">Create New</button>
索引-actors.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-index-actors',
templateUrl: './index-actors.component.html',
styleUrls: ['./index-actors.component.css']
})
export class IndexActorsComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}
解决方案
似乎当你绑定的数据模型不匹配
在
编辑actor.component.ts
利用
model: actorCreationDTO = {
// your object
}
代替
model: actorDTO = {
// your object
}
或者,你必须改变
在
form-actor.component.ts
这个
model!:actorCreationDTO;
进入这个
model!:actorDTO;
推荐阅读
- mysql - Laravel Eloquent 试图检索表中具有相同外键的所有答案
- python-3.x - 无法使用烧瓶 wsgi 渲染模板
- amazon-ec2 - 试图获取 ec2 图像列表,包括 blockDeviceMappings.snpshotID
- android - Android Studio 中的哨兵上传失败
- javascript - 将具有 onclick 功能的动态按钮添加到单元格
- java - UUID 的紧凑替代品作为相关 ID
- ios - 如何使用 Swift 5 将 Dropbox API 连接到 iOS 应用程序
- amazon-web-services - 新创建的 AWS 成员账户缺少 IAM 角色
- arrays - 如何在通过switch case选择的数组中添加元素
- vue.js - 如何使用 vuejs 为 div 添加颜色