如何在角形材质中使用输入类型文件

时间:2018-10-03 07:38:27

标签: angular angular-material material-design

如何在角形材料中使用输入类型文件

您好,我正在使用棱角材料进行设计。当我在角形材质站点上时,没有输入类型文件元素。任何人都知道这一点。

5 个答案:

答案 0 :(得分:12)

如果您只需要一个显示良好的文件输入按钮,那么这里是一种解决方法。

HTML

<button type="button" mat-raised-button (click)="fileInput.click()">Choose File</button>
<input hidden (change)="onFileSelected()" #fileInput type="file" id="file">

组件

onFileSelected() {
  const inputNode: any = document.querySelector('#file');

  if (typeof (FileReader) !== 'undefined') {
    const reader = new FileReader();

    reader.onload = (e: any) => {
      this.srcResult = e.target.result;
    };

    reader.readAsArrayBuffer(inputNode.files[0]);
  }
}

受此Angular Material Github问题评论的启发 https://github.com/angular/material2/issues/3262#issuecomment-309000588

答案 1 :(得分:6)

Angular Material还不支持文件上传的解决方法。 还有其他方法可以存档。例如使用外部库。

角度材料文件上传link to npm package

支持的功能

  • 拖放
  • 常见上载
  • 进度栏
  • 文件大小及更多...

ngx-material-file-input Link to repository

支持的功能

  • ngx-mat-file-input组件,用于在Angular Material mat-form-field中使用
  • 带有FileValidator的{​​{1}},以限制文件大小
  • 一个maxContentSize,以人类可读的格式设置文件大小
  • 以及更多小的次要功能...

答案 2 :(得分:2)

我建议您结帐@angular-material-components/file-input

非常符合Angular Material。

enter image description here

答案 3 :(得分:0)

如果您不想使用一些奇怪的解决方法,则不要将input放入mat-form-field中。您可以将其放置在mat-form-field之外,但仍将值包括在FormGroup中。检查示例

<form [formGroup]="someForm"  (ngSubmit)="onSubmit()">
            <!--input outside the form-field-->
            <input type="file" (Change)="onChange($event)"/>
            <mat-form-field>
                <!--input inside the form-field-->
                <input matInput formControlName="someFCN">
            </mat-form-field>
            <button mat-raised-button>Submit</button>
</form>




import { FormBuilder, FormGroup, Validators } from '@angular/forms';

someForm: FormGroup;

constructor(private formBuilder: FormBuilder) {}
ngOnInit(): void {
    this.someForm = this.formBuilder.group({
          someFCN: [{ value:'', disabled: false },Validators.required],
          file: { value:'', disabled: false }
        });
}

onChange(event: Event) {
    /*not sure what you want to do with file, i'll just set
    selected file´s name as value, but obviously u can do much more than just get file´s name.*/
    
    this.someForm.controls['file'].setValue(event.target.files[0].name);
}

onSubmit() {
    return this.someForm.getRawValue();
}

答案 4 :(得分:0)

style the default input element of type file using the ::file-selector-button 看起来像有角度的材质按钮更有意义。此外,这种方式考虑了 UX,它通过显示文件名让用户知道要上传的文件已添加到表单中。

<块引用>

附言检查后从声明中复制了样式 角垫凸起按钮

input[type="file"]::file-selector-button {
  box-shadow: 0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%);
  background: #ffd740;
  box-sizing: border-box;
  position: relative;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  cursor: pointer;
  outline: none;
  border: none;
  -webkit-tap-highlight-color: transparent;
  display: inline-block;
  white-space: nowrap;
  text-decoration: none;
  vertical-align: baseline;
  text-align: center;
  margin: 0;
  min-width: 64px;
  line-height: 36px;
  padding: 0 16px;
  border-radius: 4px;
  overflow: visible;
  transform: translate3d(0, 0, 0);
  transition: background 400ms cubic-bezier(0.25, 0.8, 0.25, 1), box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
  margin: 1rem;
}


/*  fallback for older browsers supporting the -webkit prefix */

input[type="file"]::-webkit-file-upload-button {
  box-shadow: 0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%);
  background: #ffd740;
  box-sizing: border-box;
  position: relative;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  cursor: pointer;
  outline: none;
  border: none;
  -webkit-tap-highlight-color: transparent;
  display: inline-block;
  white-space: nowrap;
  text-decoration: none;
  vertical-align: baseline;
  text-align: center;
  margin: 0;
  min-width: 64px;
  line-height: 36px;
  padding: 0 16px;
  border-radius: 4px;
  overflow: visible;
  transform: translate3d(0, 0, 0);
  transition: background 400ms cubic-bezier(0.25, 0.8, 0.25, 1), box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
  margin: 1rem;
  font-weight: 500;
}
<form>
  <label for="fileUpload">Add file</label>
  <input type="file" id="fileUpload">
</form>