Próbowałem stworzyć formularz do księgowania blogów, a chcę mieć wybrane ikony kategorii obok tytułu.

Zrobiłem formularz z selekcyjnymi ikonami czcionek, ale kiedy wybrałem kategorię, nie mogę wybrać innego, aby ponownie zmienić ikonę. Zmiany są tylko wtedy, gdy "zresetuję" z opcją "Brak" pomiędzy każdym wyborem.

Doh!

Jednakże, gdy zmienam kod, aby użyć nazwy ikony jako łańcucha, zamiast wejścia ikony zmienia się z każdym wyborem, jak tego chcę. Po prostu nie rozumiem, jak można regularnie aktualizować tekst, ale nie ikona.

oh, c'mon!

To jest mój rzeczywisty kod:
[ create.component.html ]]

...
<div class="blog-container">
  <mat-card class="blog-card">
    <section>
      <h2>Create blog post</h2>
    </section>
    <form [formGroup]="createForm" class="width-1">

      <div class="width-1">
        <mat-form-field class="blog-title" appearance="outline">
          <mat-label>Post Title*</mat-label>
          <input matInput formControlName="newTitle" #newTitle>
          <mat-icon matSuffix *ngIf="category" [fontSet]="category.set" [fontIcon]="category.icon"></mat-icon>
          <mat-hint>the first two fields are required</mat-hint>
        </mat-form-field>
      </div>

      <div class="width-1">
        <mat-form-field class="blog-text" appearance="outline">
          <mat-label>Bread Text*</mat-label>
          <textarea matInput rows="2" formControlName="newText" #newText></textarea>
        </mat-form-field>
      </div>

      <div class="width-1 blog-row">
        <mat-form-field class="blog-author" appearance="fill">
          <mat-label>Author</mat-label>
          <input matInput formControlName="newAuthor" #newAuthor>
        </mat-form-field>

        <mat-form-field class="blog-category" appearance="fill">
          <mat-label>Category</mat-label>
          <mat-select [(value)]="category" formControlName="newCategory" #newCategory>
            <mat-select-trigger *ngIf="category">
              <span>{{category.name}}</span>
            </mat-select-trigger>
            <mat-option [value]="null">
              <span>None</span>
            </mat-option>
            <mat-option *ngFor="let category of categories" [value]="category">
              <mat-icon [fontSet]="category.set" [fontIcon]="category.icon"></mat-icon>
              <span>{{category.name}}</span>
            </mat-option>
          </mat-select>
        </mat-form-field>
      </div>

      <div class="width-1 center">
        <button mat-raised-button color="primary" routerLink="/archive">BACK</button>
        <button type="submit" (click)="addPost(title.value, text.value, author.value, category.value)" [disabled]="createForm.pristine || createForm.invalid" mat-raised-button color="primary">POST</button>
      </div>
    </form>
  </mat-card>
</div>
...

[ create.component.ts ]

import { Component, OnInit } from '@angular/core';

import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { PostService } from '../../post.service';

@Component({
  selector: 'app-create',
  templateUrl: './create.component.html',
  styleUrls: ['./create.component.scss']
})
export class CreateComponent implements OnInit {

  createForm: FormGroup;

  category: CategoryDTO = null;
  categories: CategoryDTO[] = [
    new CategoryDTO({name: 'Programming', set: 'fas', icon: 'fa-laptop-code'}),
    new CategoryDTO({name: 'Croshetting', set: 'fas', icon: 'fa-cut'}),
    new CategoryDTO({name: 'Arts/Crafts', set: 'fas', icon: 'fa-tools'})
  ];

  constructor(private postService: PostService, private fb: FormBuilder, private router: Router) {
    this.createForm = this.fb.group({
      newTitle: ['', Validators.required],
      newText: ['', Validators.required],
      newAuthor: '',
      newCategory: ''
    });
  }

  addPost(newTitle, newText, newAuthor, newCategory){
    this.postService.addPost(newTitle, newText, newAuthor, newCategory).subscribe(() => {
      this.router.navigate(['/archive']);
    });
  }

  ngOnInit() {
  }

}

class CategoryDTO {
  name: string;
  set: string;
  icon: string;
  constructor(category?: any) {
    this.name = category && category.name || null;
    this.set = category && category.set || null;
    this.icon = category && category.icon || null;
  }
}

Ponieważ nie mogę załadować czcionki niesamowitej CSS w Stackblitz (o ile wiem), To jest Najbliżej mogłem się odtworzyć do zarządzania kodem.

Jestem nowy w Angular.

3
Eduardo Isla Venegas 21 grudzień 2019, 02:25

1 odpowiedź

Najlepsza odpowiedź

I importowałem formularz i członkowie (Fontawesomemodule już tam) w moim pliku create.component.ts i ponownie dodałem node_modules/@fortawesome/fontawesome-free/css/all.min.css w "Style: [...]" > angular.json i to zrobiła sztuczka!
O ile mogę powiedzieć, mając import { faCut, faCode, faTools } from '@fortawesome/free-solid-svg-icons'; w create.component.ts nie ma znaczenia.
.. Dzięki "Allabakash" za wskazanie mnie we właściwym kierunku. :)

0
Eduardo Isla Venegas 21 grudzień 2019, 17:01