Ошибка: не удается разрешить все параметры для MemberDetailsComponent: (?, [Объект объекта], [объект объекта]) - PullRequest
1 голос
/ 13 октября 2019

Я получаю эту ошибку для моего компонента. Я понимаю, что это проблема с внедрением AppService в MemberDetailsComponent. Но я не понимаю, в чем здесь проблема. Я подтвердил, что polyfills.js содержит строку ниже

import 'core-js/es7/reflect';

Я борюсь в течение нескольких дней. Любая помощь здесь, пожалуйста.

Ошибка:

 MemberDetailsComponent should create
Failed: Can't resolve all parameters for MemberDetailsComponent: (?, [object Object], [object Object]).
Error: Can't resolve all parameters for MemberDetailsComponent: (?, [object Object], [object Object]).
    at syntaxError (webpack:///./node_modules/@angular/compiler/fesm5/compiler.js?:1270:17)
    at CompileMetadataResolver._getDependenciesMetadata (webpack:///./node_modules/@angular/compiler/fesm5/compiler.js?:11171:35)
    at CompileMetadataResolver._getTypeMetadata (webpack:///./node_modules/@angular/compiler/fesm5/compiler.js?:11064:26)
    at CompileMetadataResolver.getNonNormalizedDirectiveMetadata (webpack:///./node_modules/@angular/compiler/fesm5/compiler.js?:10683:24)
    at CompileMetadataResolver.loadDirectiveMetadata (webpack:///./node_modules/@angular/compiler/fesm5/compiler.js?:10545:23)
    at eval (webpack:///./node_modules/@angular/compiler/fesm5/compiler.js?:24119:55)
    at Array.forEach (<anonymous>)
    at eval (webpack:///./node_modules/@angular/compiler/fesm5/compiler.js?:24118:72)
    at Array.forEach (<anonymous>)
    at JitCompiler._loadModules (webpack:///./node_modules/@angular/compiler/fesm5/compiler.js?:24115:75)

app.module.ts

export const ROUTES = [
  {
    path: '',
    redirectTo: 'login',
    pathMatch: 'full'
  },
  {
    path: 'members',
    component: MembersComponent
  },
    {
        path: 'details',
        component: MemberDetailsComponent
      },
  {
    path: 'login',
    component: LoginComponent
  }
];

// Notice how both FormsModule and ReactiveFormsModule imported...choices, choices!
@NgModule({
  declarations: [AppComponent, BannerComponent, MemberDetailsComponent, MembersComponent, LoginComponent],
  imports: [
    BrowserModule,
    RouterModule.forRoot(ROUTES, { useHash: true }),
    ReactiveFormsModule,
    BrowserAnimationsModule,
    FormsModule,
    HttpClientModule,
    DialogModule
  ],
  providers: [AppService, HttpClient],
  bootstrap: [AppComponent]
})

app.service.ts

    @Injectable({
  providedIn: 'root'
})
@Injectable()
export class AppService {
  api = 'http://localhost:8000/api';
  username: string;
  DEBUG: Boolean = false;
  editMode: Boolean = false;
  memberDialog = false;
  members = [];
  member:Member = new Member();
  constructor(private http: HttpClient) {
      if (this.DEBUG) {
          this.api = 'http://localhost:3000';
        } else {
          this.api = 'http://localhost:8000/api';
        }
  }
  -- service methods --

member-details-component.ts

 import { Component, OnInit, OnChanges } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AppService } from '../app.service';
import { Router } from '@angular/router';

// This interface may be useful in the times ahead...
export class Member {
id:number;
firstName: string;
lastName: string;
jobTitle: string;
team: string;
status: string;
}

@Component({
selector: 'app-member-details',
templateUrl: './member-details.component.html',
styleUrls: ['./member-details.component.css']
})
export class MemberDetailsComponent implements OnInit, OnChanges {
memberModel: Member = new Member();
memberForm: FormGroup;
submitted = false;
alertType: String = "";
alertMessage: String ="";
teams = [];

constructor( public appService: AppService, private fb: FormBuilder, private router: Router) {
  this.memberForm = this.fb.group({
              firstName: ['', Validators.required],
              lastName: ['', Validators.required],
              jobTitle: ['', Validators.required],
              team: ['', Validators.required],
              status: ['', Validators.required]
          });
}

ngOnInit() {
  this.appService.getTeams().subscribe((teams) => (this.teams = teams));
}
ngOnChanges() {}
onSubmit() {
   -- logic
}
}

member-details-component.spec.ts

 import { async, ComponentFixture, TestBed, inject  } from '@angular/core/testing';

import { MemberDetailsComponent } from './member-details.component';
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
import { Router } from '@angular/router';
import { HttpClientModule } from '@angular/common/http';

import { RouterModule } from '@angular/router';
import { AppService } from '../app.service';



// Bonus points!
describe('MemberDetailsComponent', () => {
 let component: MemberDetailsComponent;
 let fixture: ComponentFixture<MemberDetailsComponent>;
 let appService: AppService;
 let httpMock: HttpTestingController;

 beforeEach(async(() => {
   TestBed.configureTestingModule({
     declarations: [ MemberDetailsComponent ],
     imports: [HttpClientModule],
           providers: [
             { provide: AppService, useValue: {} },
             {
               provide: Router,
               useClass: class {
                 navigate = jasmine.createSpy('navigate');
               }
             }
           ]
   })
   .compileComponents();
 }));

 beforeEach(() => {
   appService = TestBed.get(AppService);
   httpMock = TestBed.get(HttpTestingController);
   fixture = TestBed.createComponent(MemberDetailsComponent);
   component = fixture.componentInstance;
   fixture.detectChanges();
 });

 it('should create', () => {
   expect(component).toBeTruthy();
 });
});

Код в StackBlitz: https://stackblitz.com/edit/angular-8damnn

1 Ответ

0 голосов
/ 14 октября 2019

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

https://stackblitz.com/edit/angular-dpqftw

Я создал папку Models с классом Member внутри, это лучший способ, если вам нужно обмениваться моделями, создайте для него отдельный файл. Я изменил импорт везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...