/angular-guide > _

სთეითში მონაცემების დამატება

მონაცემების დასამატებლად დაგვჭირდება სერვისში სათანადო ლოგიკის შემოტანა:

  public addItem(title: string) {
    const itemToAdd = {
      title: title,
      done: false,
    };

    const headers = new HttpHeaders({
      'Content-Type': 'application/json',
    });

    this.http
      .post<{ id: number }>(this.url, itemToAdd, {
        headers,
      })
      .pipe(
        tap((response) => {
          const newItem = {
            id: response.id,
            ...itemToAdd,
          };
          this.todos$.next([...this.todos$.value, newItem]);
        })
      )
      .subscribe();
  }

ჩვენ პარამეტრში მივიღებთ ახალი ნივთის აღწერას. მისგან ვქმნით ობიექტს, რომელსაც ექნება სათაური და done, რომელიც თავიდან მცდარი უნდა იყოს. id თვისებას json-server თავისით მიანიჭებს უნიკალური მნიშვნელობით.

აქვე ვქმნით HttpHeaders-ის ინსტანციას, სადაც საჭიროა რომ მივუთითოთ Content-Type როგორც application/json რათა მოთხხოვნამ მონაცემები მიიღოს (ეს json-server-ის სპეციფიკური საჭიროებაა). მოღხოვნას ვაგზავნით და ვაწვდით ახალ ნივთს (რომელიც სტრინგად ავტომატურად დაკონვერტირდება). მესამე არგუმენტად ვაწოდებთ ობიექტში (შემოკლებულად) headers თვისებაში ჩვენი HttpHeaders-ის ინსტანციას.

საპასუხოდ სერვერი გვიბრუნებს ობიექტს, სადაც გვაქვს რიცხვის ტიპის აიდი. ამის საფუძველზე შეგვიძლია დავწეროთ ეფექტი tap ოპერატორში, სადაც ამ აიდის ავიღებთ, ჩავსვამთ ობიექტში, რომელსაც ასევე ექნება ის დანარჩენი თვისებები, რაც თავიდან შექმნილ ახალ ნივთს მივეცით და დავანექსთებთ ახალ მასივს, სადაც ჩავყრით სპრედ ოპერატორით todos$ სტრიმის უკანასკნელ მნიშვნელობას, პლიუს ახლად შექმნილ ნივთს. ასე სტრიმში ვანექსთებთ ძველ მასივს მასში დამატებული ახალი ნივთით.

კომპონენტის კლასში შემოვიტანოთ თვისება newItemTitle სადაც შეყვანილ ტექსტს შევინახავთ და addItem მეთოდი, რომლითაც დავუძახებთ სერვისზე დამატების მეთოდს და მას შეყვანილ ტექსტს გავატანთ. ამის შემდეგ ტექსტს ვაცარიელებთ.

import { ChangeDetectionStrategy, Component, OnInit } from "@angular/core";
import { CommonModule } from "@angular/common";
import { FormsModule } from "@angular/forms";
import { TodoItem, TodoService } from "./todo.service";

@Component({
  selector: "app-root",
  standalone: true,
  imports: [CommonModule, FormsModule],
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent implements OnInit {
  newItemTitle = "";

  todos$ = this.todoService.todos;

  constructor(private todoService: TodoService) {}

  ngOnInit(): void {
    this.todoService.init();
  }

  addItem() {
    this.todoService.addItem(this.newItemTitle);
    this.newItemTitle = "";
  }
}

თემფლეითში ul ელემენტამდე ჩავსვათ კონტეინერი, სადაც მოვათავსებთ input-სა და ღილაკს. input დავაკავშიროთ კლასის თვისებასთან NgModel-ით, ხოლო ღილაკზე დაკლიკების მოვლენა მივაბათ addItem მეთოდს. ღილაკი გაუქმებული იქნება, თუ newItemTitle ცარიელი სტრინგია.

<div class="row mb-2 gap-2 p-2">
  <input
    type="text"
    placeholder="Add a new item..."
    [(ngModel)]="newItemTitle"
    class="col-12"
  />
  <button
    class="btn btn-primary col-12"
    [disabled]="!newItemTitle"
    (click)="addItem()"
  >
    <span>Add</span>
  </button>
</div>

ტექსტის შეყვანა და ღილაკზე დაკლიკება სერვისზე მეთოდს გააქტიურებს რაც HTTP მოთხოვნას განახორციელებს და სტრიმს განაახლებს ახალი დამატებული ნივთით. ვინაიდან სტრიმზე უკვე თემფლეითში ვასუბსქრაიბებთ, შედეგი გამოჩნდება.

ახლა სთეითში მოლოდინის რეჟიმისა და ერორების ასახვაზე გადავინაცვლოთ.