Javascript Angular 2 Fix动态粒子JS无法读取属性';getElementsByClassName';空的

Javascript Angular 2 Fix动态粒子JS无法读取属性';getElementsByClassName';空的,javascript,angular,typescript,particles.js,Javascript,Angular,Typescript,Particles.js,我正在使用angular 2 v4开发一个web应用程序,我想使用一个参数动态地包含不同的Particles.js,我想加载一个特定的Particles格式 问题是这个参数来自数据库,我通过可观察对象来管理它,因此不可能从ngOnInit函数或构造函数加载它 一切正常并正确加载文档,问题是当我离开该路线时,出现错误: Cannot read property 'getElementsByClassName' of null 这里是我的一些配置 angular cli.json "scripts

我正在使用angular 2 v4开发一个web应用程序,我想使用一个参数动态地包含不同的Particles.js,我想加载一个特定的Particles格式

问题是这个参数来自数据库,我通过可观察对象来管理它,因此不可能从ngOnInit函数或构造函数加载它

一切正常并正确加载文档,问题是当我离开该路线时,出现错误:

Cannot read property 'getElementsByClassName' of null
这里是我的一些配置

angular cli.json

"scripts": [
        ...
        "../node_modules/particles.js/particles.js",
        ...
      ],
login.ts

declare var particlesJS: any;
@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {
// Color variables----------------------------------------------------
    default = false;
    amber = false;
    green = false;
    red = false;
    blue = false;
    gray = false;
    white = false;
    purple = false;
    orange = false;
    lightBlue = false;
  // Color variables----------------------------------------------------

  clientConfig: any;
  constructor(public clientConfigService: ClientConfigService) {
        this.clientConfigService.readData().subscribe(data => {
          this.clientConfig = data;
          this.changeTheme(this.clientConfig);
        } );
      }
  ngOnInit() {}

  changeTheme(config: Client) {
    this.default = false;
    this.amber = false;
    this.green = false;
    this.red = false;
    this.blue = false;
    this.gray = false;
    this.white = false;
    this.purple = false;
    this.orange = false;
    this.lightBlue = false;
    switch (config.color) {
      case 'default': this.default = true; particlesJS.load('particles-js', 'assets/data/default-particles.json'); break;
      case 'amber': this.amber = true; particlesJS.load('particles-js', 'assets/data/amber-particles.json'); break;
      case 'green': this.green = true; particlesJS.load('particles-js', 'assets/data/green-particles.json'); break;
      case 'red': this.red = true; particlesJS.load('particles-js', 'assets/data/red-particles.json'); break;
      case 'blue': this.blue = true; particlesJS.load('particles-js', 'assets/data/blue-particles.json'); break;
      case 'gray': this.gray = true; particlesJS.load('particles-js', 'assets/data/gray-particles.json'); break;
      case 'white': this.white = true; particlesJS.load('particles-js', 'assets/data/white-particles.json'); break;
      case 'purple': this.purple = true; particlesJS.load('particles-js', 'assets/data/purple-particles.json'); break;
      case 'orange': this.orange = true; particlesJS.load('particles-js', 'assets/data/orange-particles.json'); break;
      case 'lightblue': this.lightBlue = true; particlesJS.load('particles-js', 'assets/data/light-blue-particles.json'); break;
      default: this.default = true; particlesJS.load('particles-js', 'assets/data/default-particles.json'); break;
    }
  }
}
login.html

<div id="particles-js"></div>
<div class="whitemask">
    <div id="particles-js" fxLayout="column" fxLayoutAlign="center center" class=" gradient-animated">
      <div class="session-wrapper" style="position: absolute;">

        <div class="mat-card-login">
          <div class="login-form">
            <form [formGroup]="form" (ngSubmit)="onSubmit()" autocomplete="off">
              <div fxLayout="column" fxLayoutAlign="space-around">
                <div class="pb-1">
                  <mat-form-field color="accent" class="login-input" style="width: 100%">
                    <input name="i-sl-li-lg-001" matInput placeholder="Cuenta"  [formControl]="form.controls['account']">
                    <mat-error *ngIf="form.controls['account'].hasError('required') && form.controls['account'].touched" class="mat-text-warn">Debe ingresar una cuenta válida.</mat-error>
                  </mat-form-field>
                </div>
                <div class="pb-1">
                  <mat-form-field color="accent" class="login-input" style="width: 100%">
                    <input name="i-sl-li-lg-003" matInput color="accent" [type]="passvisible" placeholder="Contraseña" [formControl]="form.controls['password']">
                    <mat-icon matSuffix (click)="visibePass()" style="cursor: pointer" [ngStyle]="{ 'color': passvisible === 'password' ? 'rgba(0,0,0,0.44)' : 'black' }">visibility</mat-icon>
                    <mat-error *ngIf="form.controls['password'].hasError('required') && form.controls['password'].touched" class="mat-text-warn">Debe ingresar una contraseña.</mat-error>
                  </mat-form-field>
                </div>
                <div *ngIf="showMessage" fxLayout="row" fxLayoutAlign="center center" class="errortext" style="margin-bottom: 10px; margin-top: -15px">{{ error }}</div>
                <button id="b152" mat-raised-button class="login-button" type="submit" [disabled]="!form.valid">Iniciar sesión</button>

                <div style="padding-top: 10px" fxLayout="row" fxLayoutAlign="center center">
                    <a class="forgot" [routerLink]="['/session/forgot']">¿Olvidaste tu contraseña?</a>
                </div>
              </div>
            </form>
          </div>
        </div>

      </div>
    </div>
  </div>
Login.html

<div id="particles-js"></div>
<div class="whitemask">
    <div id="particles-js" fxLayout="column" fxLayoutAlign="center center" class=" gradient-animated">
      <div class="session-wrapper" style="position: absolute;">

        <div class="mat-card-login">
          <div class="login-form">
            <form [formGroup]="form" (ngSubmit)="onSubmit()" autocomplete="off">
              <div fxLayout="column" fxLayoutAlign="space-around">
                <div class="pb-1">
                  <mat-form-field color="accent" class="login-input" style="width: 100%">
                    <input name="i-sl-li-lg-001" matInput placeholder="Cuenta"  [formControl]="form.controls['account']">
                    <mat-error *ngIf="form.controls['account'].hasError('required') && form.controls['account'].touched" class="mat-text-warn">Debe ingresar una cuenta válida.</mat-error>
                  </mat-form-field>
                </div>
                <div class="pb-1">
                  <mat-form-field color="accent" class="login-input" style="width: 100%">
                    <input name="i-sl-li-lg-003" matInput color="accent" [type]="passvisible" placeholder="Contraseña" [formControl]="form.controls['password']">
                    <mat-icon matSuffix (click)="visibePass()" style="cursor: pointer" [ngStyle]="{ 'color': passvisible === 'password' ? 'rgba(0,0,0,0.44)' : 'black' }">visibility</mat-icon>
                    <mat-error *ngIf="form.controls['password'].hasError('required') && form.controls['password'].touched" class="mat-text-warn">Debe ingresar una contraseña.</mat-error>
                  </mat-form-field>
                </div>
                <div *ngIf="showMessage" fxLayout="row" fxLayoutAlign="center center" class="errortext" style="margin-bottom: 10px; margin-top: -15px">{{ error }}</div>
                <button id="b152" mat-raised-button class="login-button" type="submit" [disabled]="!form.valid">Iniciar sesión</button>

                <div style="padding-top: 10px" fxLayout="row" fxLayoutAlign="center center">
                    <a class="forgot" [routerLink]="['/session/forgot']">¿Olvidaste tu contraseña?</a>
                </div>
              </div>
            </form>
          </div>
        </div>

      </div>
    </div>
  </div>

请将构造中的代码移到ngAfterViewInit,然后重试

declare var particlesJS: any;
@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit, AfterViewInit {
// Color variables----------------------------------------------------
    default = false;
    amber = false;
    green = false;
    red = false;
    blue = false;
    gray = false;
    white = false;
    purple = false;
    orange = false;
    lightBlue = false;
  // Color variables----------------------------------------------------

  clientConfig: any;
  constructor(public clientConfigService: ClientConfigService) {

  }

  ngOnInit() {}

  ngAfterViewInit() {
       this.clientConfigService.readData().subscribe(data => {
          this.clientConfig = data;
          this.changeTheme(this.clientConfig);
        } );
  }

  changeTheme(config: Client) {
    this.default = false;
    this.amber = false;
    this.green = false;
    this.red = false;
    this.blue = false;
    this.gray = false;
    this.white = false;
    this.purple = false;
    this.orange = false;
    this.lightBlue = false;
    switch (config.color) {
      case 'default': this.default = true; particlesJS.load('particles-js', 'assets/data/default-particles.json'); break;
      case 'amber': this.amber = true; particlesJS.load('particles-js', 'assets/data/amber-particles.json'); break;
      case 'green': this.green = true; particlesJS.load('particles-js', 'assets/data/green-particles.json'); break;
      case 'red': this.red = true; particlesJS.load('particles-js', 'assets/data/red-particles.json'); break;
      case 'blue': this.blue = true; particlesJS.load('particles-js', 'assets/data/blue-particles.json'); break;
      case 'gray': this.gray = true; particlesJS.load('particles-js', 'assets/data/gray-particles.json'); break;
      case 'white': this.white = true; particlesJS.load('particles-js', 'assets/data/white-particles.json'); break;
      case 'purple': this.purple = true; particlesJS.load('particles-js', 'assets/data/purple-particles.json'); break;
      case 'orange': this.orange = true; particlesJS.load('particles-js', 'assets/data/orange-particles.json'); break;
      case 'lightblue': this.lightBlue = true; particlesJS.load('particles-js', 'assets/data/light-blue-particles.json'); break;
      default: this.default = true; particlesJS.load('particles-js', 'assets/data/default-particles.json'); break;
    }
  }
}

您收到此错误是因为particles.js尝试访问的html元素尚未生成。请查看以了解更多信息。

谢谢您的回复,但不幸的是,它没有起作用。你们知道有其他方法来修复这个错误吗?我创建了一个Stackblitz应用程序的例子,它已经运行了。请核对:
declare var particlesJS: any;
@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit, AfterViewInit {
// Color variables----------------------------------------------------
    default = false;
    amber = false;
    green = false;
    red = false;
    blue = false;
    gray = false;
    white = false;
    purple = false;
    orange = false;
    lightBlue = false;
  // Color variables----------------------------------------------------

  clientConfig: any;
  constructor(public clientConfigService: ClientConfigService) {

  }

  ngOnInit() {}

  ngAfterViewInit() {
       this.clientConfigService.readData().subscribe(data => {
          this.clientConfig = data;
          this.changeTheme(this.clientConfig);
        } );
  }

  changeTheme(config: Client) {
    this.default = false;
    this.amber = false;
    this.green = false;
    this.red = false;
    this.blue = false;
    this.gray = false;
    this.white = false;
    this.purple = false;
    this.orange = false;
    this.lightBlue = false;
    switch (config.color) {
      case 'default': this.default = true; particlesJS.load('particles-js', 'assets/data/default-particles.json'); break;
      case 'amber': this.amber = true; particlesJS.load('particles-js', 'assets/data/amber-particles.json'); break;
      case 'green': this.green = true; particlesJS.load('particles-js', 'assets/data/green-particles.json'); break;
      case 'red': this.red = true; particlesJS.load('particles-js', 'assets/data/red-particles.json'); break;
      case 'blue': this.blue = true; particlesJS.load('particles-js', 'assets/data/blue-particles.json'); break;
      case 'gray': this.gray = true; particlesJS.load('particles-js', 'assets/data/gray-particles.json'); break;
      case 'white': this.white = true; particlesJS.load('particles-js', 'assets/data/white-particles.json'); break;
      case 'purple': this.purple = true; particlesJS.load('particles-js', 'assets/data/purple-particles.json'); break;
      case 'orange': this.orange = true; particlesJS.load('particles-js', 'assets/data/orange-particles.json'); break;
      case 'lightblue': this.lightBlue = true; particlesJS.load('particles-js', 'assets/data/light-blue-particles.json'); break;
      default: this.default = true; particlesJS.load('particles-js', 'assets/data/default-particles.json'); break;
    }
  }
}