Angular 2 - несколько шаблонов - PullRequest
0 голосов
/ 11 мая 2018

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

Мой стандартный шаблон выглядит так:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Template 1</title>
    <base href="/">

    <meta name="viewport" content="width=device-width, initial-scale=1">    
</head>
<body>
<app-root></app-root>


</body>
</html>

Теперь в какой-то момент мне бы хотелосьчтобы перейти к следующему шаблону:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Template 2</title>
    <base href="/">

    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" type="image/x-icon" href="favicon.ico">
    <link type="text/css" rel="stylesheet" href="assets/reveal.js-3.6.0/css/reveal.css">
    <link type="text/css" rel="stylesheet" href="assets/reveal.js-3.6.0/css/theme/black.css">
    <link type="text/css" rel="stylesheet" href="assets/reveal.js-3.6.0/lib/css/zenburn.css">

</head>
<body>
<app-root></app-root>

<script type="application/javascript" src="assets/reveal.js-3.6.0/lib/js/classList.js"></script>
<script type="application/javascript" src="assets/reveal.js-3.6.0/lib/js/head.min.js"></script>
<script type="application/javascript" src="assets/reveal.js-3.6.0/js/reveal.js"></script>

</body>
</html>

Мой вопрос: как я могу это сделать?Либо используя components или modules?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018
<ng-template [ngIf]="lessons" [ngIfElse]="loading">
   <div class="lessons-list">
     ... 
   </div>
</ng-template>

<ng-template #loading>
    <div>Loading...</div>`enter code here`
</ng-template>
0 голосов
/ 14 мая 2018

Я не думаю, что это хорошая практика - динамически изменять содержимое файла index.html. Из того, что я вижу, вам нужно загружать только несколько файлов css и js, когда выполняются определенные условия.

Вместо того, чтобы касаться содержимого индексного файла, как насчет обработки того, какие ресурсы необходимо загрузить (и загрузить их) внутри отдельной службы во время инициализации вашего приложения?

Это может выглядеть немного странно, ноэто сработало для меня, по крайней мере, для загрузки некоторых дополнительных CSS.

app.module.ts

export function ResourceProviderFactory( provider: ResourcesService ) {
  return () => provider.loadResources();
}

@NgModule({
  imports: [
    ...
  ],
  declarations: [ 
    ...
  ],
  providers: [
    ResourcesService,
    {
      provide: APP_INITIALIZER,
      useFactory: ResourceProviderFactory,
      deps: [ ResourcesService ],
      multi: true
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

resources.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';


@Injectable()
export class ResourcesService {

  private _resources = {
    typeA: [
        'assets/reveal.js-3.6.0/css/reveal.css'
        'assets/reveal.js-3.6.0/lib/js/classList.js'
    ]
  }


  constructor( private _http: HttpClient  ) {
  }

  public loadResources(): Promise<boolean> {
    let res;
    if( condition_met ) {
        for( let r of this._resources.typeA ) {
            res = this._resources.typeA[r];
            if( res.indexOf('css') >= 0 ) {
                loadCSS( res );
            }else if ( res.indexOf('js') >= 0 ) {
                loadJS( res );
            }
        }
    }
  }

  public loadCSS( resourcePath: string ) {
    const link = document.createElement( 'link' );
    link.type = 'text/css';
    link.rel = 'stylesheet';
    link.href = 'resourcePath;
    document.getElementsByTagName( 'head' )[0].appendChild( link );
  }

  public loadJS( resourcePath: string ) {
    const link = document.createElement( 'link' );
    link.type = 'application/javascript';
    link.href =  resourcePath;
    document.getElementsByTagName( 'head' )[0].appendChild( link );
  }

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