AngularJS версии 6. * Метод обслуживания не определен

Поэтому я просто пытаюсь написать компонент и службу, которые из одного представления принимают вводимые пользователем данные и передают их API для проверки. Проблема в том, что в моем компоненте говорится, что служба по существу не имеет метода login и не определена. Однако я очень внимательно проверил и перепроверил, следуя документации Angular.io, но ничего не могу заставить работать.

LoginComponent.ts

import { Component, OnInit } from '@angular/core';
import { UserService } from '../../../services/user.service';

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

  constructor(private userService: UserService) {
    console.info('userService', userService);
  }

  ngOnInit() {}

  handleSubmit(data) {
    // https://api-test.sarahlawrence.edu:82/
    this.userService.login(data)
      .subscribe(user => console.info('user', user));
  }
}

user.service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, of } from 'rxjs/index';
import { catchError, map, tap } from 'rxjs/internal/operators';

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

interface CredsInterface {
  username: string;
  password: string;
};

interface LoggedIn {
  token: string;
}

@Injectable({
  providedIn: 'root'
})
export class UserService {

  private apiUrl = '<apiUrl>';

  constructor(
    private http: HttpClient
  ) { }

  login (creds: CredsInterface): Observable<any> {
    console.info('UserService.login()', creds);

    return this.http.post<any>(`${this.apiUrl}/signin`, creds, {})
      .pipe(
        tap((loggedIn: LoggedIn) => {
          console.info(`Login: ${loggedIn}`);
        }),
        catchError(this.handleError('login()', []))
      );
  }

  /**
   * Handle Http operation that failed.
   * Let the app continue.
   * @param operation - name of the operation that failed
   * @param result - optional value to return as the observable result
   */
  private handleError<T> (operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {

      // TODO: send the error to remote logging infrastructure
      console.error(error); // log to console instead

      // TODO: better job of transforming error for user consumption
      console.info(`${operation} failed: ${error.message}`);

      // Let the app keep running by returning an empty result.
      return of(result as T);
    };
  }
}

Я не понимаю, почему я получаю эту ошибку:

AngularJS версии 6. * Метод обслуживания не определен

Итак, я вышел из службы, чтобы увидеть объект, и, как ни странно, метод помещается в прототип:

AngularJS версии 6. * Метод обслуживания не определен

Я не понимаю, я что-то не так делаю?

У вас есть стекблиц?

mwilson 19.06.2018 00:25

@mwilson Я просто пошел и создал один, работающий над помещением туда всяких вещей: stackblitz.com/edit/angular-service-issues?file=src/app/…

Tom Bird 19.06.2018 00:34

Я думаю, вы забыли сохранить изменения. Он показывает кучу ошибок из-за отсутствующих модулей. Наверное, просто вопрос пути.

mwilson 19.06.2018 00:42

@mwilson Нет, потому что нет простого способа вытащить все файлы в стек блиц

Tom Bird 19.06.2018 00:47

Это могло быть частью проблемы. Код, который у вас есть, в основном является начальным кодом, поэтому может быть проще воссоздать простой пример в stackblitz, чтобы понять, в чем проблема. Глядя на это, похоже, что в настройке довольно много ошибок. Примечательно, что похоже, что вы ссылаетесь на компонент form-login, но ничего не найдено. В том же компоненте вы пытаетесь получить доступ к несуществующему свойству onHandleSubmit. Более чем вероятно, что происходит изменение префикса, и он пытается запустить эту директиву и не может ее найти, и поэтому вы получаете сообщение об ошибке.

mwilson 19.06.2018 00:55

Вот супер базовый пример использования сервиса angular и взаимодействия с ним через любой компонент. Я считаю, что это то, что вы пытаетесь сделать: stackblitz.com/edit/…

mwilson 19.06.2018 01:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
1 051
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы называете этот метод handleSubmit?

Ошибка говорит о том, что он не может прочитать свойство login для undefined, что означает, что this.userService - это undefined. То, что метод login находится внутри прототипа, это нормально. Помните, что gets are deep and sets are shallow

Я думаю, что вы вызываете handleSubmit каким-то хитрым способом, который заставляет this ссылаться на другой объект, чем вы думаете.


Я только что видел stackblitz. Вы передаете ссылку на свою функцию с помощью [onHandleSubmit] = "handleSubmit", но когда она выполняется, this больше не является вашим компонентом LoginComponent.

Добавьте это в конструктор компонентов

this.handleSubmit = this.handleSubmit.bind(this)

Подробнее см. В этом посте: Функция обратного вызова Angular передает дочернему компоненту как @Input

Вы были правы, у меня в основном есть представление входа и форма входа, таким образом я могу повторно использовать форму входа в других местах. Добавление .bind(this) решило мою проблему! Большое спасибо, я привык реагировать там, где могу: onHandleSubmit = {() => { handleSubmit() }}, что позволяет использовать правильный объем, о котором вы говорите. Спасибо за помощь!!!!

Tom Bird 19.06.2018 00:53

Другие вопросы по теме

Как освободить память в массиве, отслеживаемом обнаружением изменений Angular2?
Плагин InAppBrowser: как встраивать приложение angular и определять его изменение URL-адреса при загрузке
Как использовать Angular для публикации данных в действии MVC в примере проекта SPA?
Как бросить первый ввод триггера анимировать angular6
Как доставить жесткие ошибки 404 в приложение angular, размещенное в IIS, с использованием пользовательских ошибок в web.config
Возврат ошибки Jasmine: ожидание возврата объекта при тестировании службы
Angular 6 с многократным запуском события щелчка на панели инструментов устройства Chrome
Ошибка компонента динамической формы markAsDirty (): ExpressionChangedAfterItHasBeenCheckedError
Триггеры получателя компонентов запускают повторную визуализацию, даже если внутренние значения не меняются
Как сделать http-сообщение с результатами / данными, которые вы получаете от полной функции в papaparse?