Angular'da harici komut dosyaları dinamik olarak nasıl yüklenir?


161

<script>Etiketi doğrudan index.html'ye eklemeden harici kitaplığı ek mantıkla birlikte oluşturan bu modüle sahibim :

import 'http://external.com/path/file.js'
//import '../js/file.js'

@Component({
    selector: 'my-app',
    template: `
        <script src="http://iknow.com/this/does/not/work/either/file.js"></script>
        <div>Template</div>`
})
export class MyAppComponent {...}

Ben fark importES6 tarafından Spec statik ve typescript yerine zamanında daha transpiling sırasında çözüldü olduğunu.

Her neyse, file.js'nin CDN'den veya yerel klasörden yüklenmesini sağlayacak şekilde yapılandırılabilir hale getirmek için? Angular 2'ye bir komut dosyasını dinamik olarak yüklemesini nasıl söyleyebilirim?


Yanıtlar:


65

System.js kullanıyorsanız System.import(), çalışma zamanında kullanabilirsiniz :

export class MyAppComponent {
  constructor(){
    System.import('path/to/your/module').then(refToLoadedModule => {
      refToLoadedModule.someFunction();
    }
  );
}

Webpack kullanıyorsanız, güçlü kod bölme desteğinden tam olarak yararlanabilirsiniz require.ensure:

export class MyAppComponent {
  constructor() {
     require.ensure(['path/to/your/module'], require => {
        let yourModule = require('path/to/your/module');
        yourModule.someFunction();
     }); 
  }
}

1
Özellikle bileşende modül yükleyiciyi kullanmam gerekiyor gibi görünüyor. SystemYükleyicinin geleceği olduğu için bu sorun değil, bence.
CallMeLaNN

6
TypeScript Plugin for Sublime TextSystemTypeScript kodundan memnun değil : Cannot find name 'System'ancak dönüştürme ve çalıştırma sırasında hata yok. Hem Angular2ve Systemkomut dosyası zaten içine eklendi index.html. Neyse etmek ve eklenti mutlu edecek mi? importSystem
CallMeLaNN

1
ama ya system.js kullanmıyorsanız!
Murhaf Sousli

2
@drewmoore ben öyle dedim neden hatırlamıyorum require()/ import1, hemen şimdi cevap olarak para cezası çalışmalıdır
Murhaf Sousli

11
Söyleyebileceğim kadarıyla bu seçenekler internetteki komut dosyaları için değil, sadece yerel dosyalar için geçerli. Bu, sorulduğu gibi orijinal soruyu yanıtlamıyor.
WillyC

151

Angular projenizde isteğe bağlı olarak JS komut dosyalarını ve kitaplıkları dinamik olarak yüklemek için aşağıdaki tekniği kullanabilirsiniz.

script.store.ts içerecek yolunu yerel olarak veya uzaktaki bir sunucu ve bir el yazısının adı komut dinamik olarak yükleme için kullanılacak

 interface Scripts {
    name: string;
    src: string;
}  
export const ScriptStore: Scripts[] = [
    {name: 'filepicker', src: 'https://api.filestackapi.com/filestack.js'},
    {name: 'rangeSlider', src: '../../../assets/js/ion.rangeSlider.min.js'}
];

script.service.ts , komut dosyasının yüklenmesini, script.service.tsolduğu gibi kopyalayan enjekte edilebilir bir hizmettir.

import {Injectable} from "@angular/core";
import {ScriptStore} from "./script.store";

declare var document: any;

@Injectable()
export class ScriptService {

private scripts: any = {};

constructor() {
    ScriptStore.forEach((script: any) => {
        this.scripts[script.name] = {
            loaded: false,
            src: script.src
        };
    });
}

load(...scripts: string[]) {
    var promises: any[] = [];
    scripts.forEach((script) => promises.push(this.loadScript(script)));
    return Promise.all(promises);
}

loadScript(name: string) {
    return new Promise((resolve, reject) => {
        //resolve if already loaded
        if (this.scripts[name].loaded) {
            resolve({script: name, loaded: true, status: 'Already Loaded'});
        }
        else {
            //load script
            let script = document.createElement('script');
            script.type = 'text/javascript';
            script.src = this.scripts[name].src;
            if (script.readyState) {  //IE
                script.onreadystatechange = () => {
                    if (script.readyState === "loaded" || script.readyState === "complete") {
                        script.onreadystatechange = null;
                        this.scripts[name].loaded = true;
                        resolve({script: name, loaded: true, status: 'Loaded'});
                    }
                };
            } else {  //Others
                script.onload = () => {
                    this.scripts[name].loaded = true;
                    resolve({script: name, loaded: true, status: 'Loaded'});
                };
            }
            script.onerror = (error: any) => resolve({script: name, loaded: false, status: 'Loaded'});
            document.getElementsByTagName('head')[0].appendChild(script);
        }
    });
}

}

ScriptServiceİhtiyacınız olan yere bunu enjekte edin ve js lib'leri bu şekilde yükleyin

this.script.load('filepicker', 'rangeSlider').then(data => {
    console.log('script loaded ', data);
}).catch(error => console.log(error));

7
Bu harika çalışıyor. İlk yükleme boyutunda 1MB'nin üzerinde tıraş - çok sayıda kitaplığım var!
Our_Benefactors

3
Görünüşe göre çok erken konuştum. Bu çözüm iOS Safari'de ÇALIŞMAZ.
Our_Benefactors

komut dosyasını yükledikten sonra alan adınızın başına eklenip eklenmediğini kontrol edin
Rahul Kumar

Belki doğru enjekte etmiyorum ama alıyorumthis.script.load is not a function
Havlu

1
Sıralı yükleme için yükleme işlevinizi değiştirdim. İşte yaptığım şey. load(...scripts: string[]) {let promise = Promise.resolve(); scripts.forEach(script => { promise = promise.then(() => this.loadScript(script)).then(res => console.log(res));});}Cevabınız için teşekkür ederim.
Willie

52

Bu işe yarayabilir. Bu Kod, tıklanan düğme üzerine <script>etiketi dinamik headolarak html dosyasının sonuna ekler .

const url = 'http://iknow.com/this/does/not/work/either/file.js';

export class MyAppComponent {
    loadAPI: Promise<any>;

    public buttonClicked() {
        this.loadAPI = new Promise((resolve) => {
            console.log('resolving promise...');
            this.loadScript();
        });
    }

    public loadScript() {
        console.log('preparing to load...')
        let node = document.createElement('script');
        node.src = url;
        node.type = 'text/javascript';
        node.async = true;
        node.charset = 'utf-8';
        document.getElementsByTagName('head')[0].appendChild(node);
    }
}

1
Thanx adam benim için çalıştı. Artık ngonit yöntemini kullanarak sayfa yüklemesinde de yükleyebilirsiniz. Bu nedenle düğme tıklaması gerekli değildir.
Niraj

Ben de aynı şekilde kullanıyorum .. ama benim için çalışmadı. lütfen bana yardım eder misin? this.loadJs ("javascriptfile yolu"); public loadjs (dosya) {let node = document.createElement ('script'); node.src = dosya; node.type = 'metin / javascript'; node.async = true; node.charset = 'utf-8'; document.getElementsByTagName ('head') [0] .appendChild (düğüm); }
Mitesh Shah

Tıklamayla mı yoksa sayfa yüklenirken mi yapmaya çalışıyorsunuz? Bize sonuç veya hata hakkında daha fazla bilgi verebilir misiniz?
ng-darren

merhaba, bunu uygulamaya çalıştım ve iyi çalıştım ama new Promiseçözülmedi. Bana bir Promiseşey ithal etmem gerekip gerekmediğini söyleyebilir misiniz ?
user3145373 ツ

Merhaba, Promise'i kullandığımda özel bir şey içe aktarmadım.
ng-darren

24

@Rahul kumars yanıtını, bunun yerine Gözlemlenebilirleri kullanacak şekilde değiştirdim:

import { Injectable } from "@angular/core";
import { Observable } from "rxjs/Observable";
import { Observer } from "rxjs/Observer";

@Injectable()
export class ScriptLoaderService {
    private scripts: ScriptModel[] = [];

    public load(script: ScriptModel): Observable<ScriptModel> {
        return new Observable<ScriptModel>((observer: Observer<ScriptModel>) => {
            var existingScript = this.scripts.find(s => s.name == script.name);

            // Complete if already loaded
            if (existingScript && existingScript.loaded) {
                observer.next(existingScript);
                observer.complete();
            }
            else {
                // Add the script
                this.scripts = [...this.scripts, script];

                // Load the script
                let scriptElement = document.createElement("script");
                scriptElement.type = "text/javascript";
                scriptElement.src = script.src;

                scriptElement.onload = () => {
                    script.loaded = true;
                    observer.next(script);
                    observer.complete();
                };

                scriptElement.onerror = (error: any) => {
                    observer.error("Couldn't load script " + script.src);
                };

                document.getElementsByTagName('body')[0].appendChild(scriptElement);
            }
        });
    }
}

export interface ScriptModel {
    name: string,
    src: string,
    loaded: boolean
}

1
Ayarlayabilir unutma asynciçin true.
Will Huang

Bir sorum var, betiği ekleyip rotalar arasında gezindiğimizde, diyelim ki betiği eve yükledim ve etrafa göz atıp eve geri döndüm, mevcut betiği yeniden başlatmanın bir yolu var mı? Önceden yüklenmiş olanı kaldırıp tekrar yüklemek istediğim anlamına mı gelir? Çok teşekkür ederim
d123546

@ d123546 Evet, bunun mümkün olmasını istiyorsanız. Ancak komut dosyası etiketini kaldıran bir mantık yazmanız gerekir. Buraya bir göz atın: stackoverflow.com/questions/14708189/…
Joel

Teşekkürler Joel, ancak komut dosyası tarafından başlatılan işlevleri bir şekilde kaldırmanın bir yolu var mı? Şu anda angular4 projemde bir sorunla karşı karşıyayım, çünkü jquery kaydırıcısını başlatan komut dosyası yüklüyorum, bu nedenle ilk rota düzgün yüklendiğinde, ancak daha sonra başka bir rotaya gidip rotama geri döndüğümde komut dosyası iki kez yükleniyor ve kaydırıcı artık yüklenmiyor :( Bu konuda bana tavsiyede bulunur
musunuz

1
Satırda bir hata var private scripts: {ScriptModel}[] = [];. O olmalıprivate scripts: ScriptModel[] = [];
Chris Haines

21

Yine başka bir seçenek, bu konu için scriptjspaketi kullanmak olacaktır.

komut dosyası kaynaklarını isteğe bağlı olarak herhangi bir URL'den yüklemenize olanak tanır

Misal

Paketi yükleyin:

npm i scriptjs

ve aşağıdakiler için tür tanımlarıscriptjs :

npm install --save @types/scriptjs

Ardından içe aktarma $script.get()yöntemi:

import { get } from 'scriptjs';

ve son olarak, bizim örneğimizde Google Haritalar kitaplığı olan komut dosyası kaynağı:

export class AppComponent implements OnInit {
  ngOnInit() {
    get("https://maps.googleapis.com/maps/api/js?key=", () => {
        //Google Maps library has been loaded...
    });
  }
}

Demo


1
Harika, ancak npm install --save @ types / scriptjs yerine npm install --save-dev @ types / scriptjs (veya sadece npm i -D @ types / scriptjs) olmalıdır
Youness Houdass

19

Sen yükleyebilir dinamik çoklu komut dosyalarını sizin böyle component.tsdosyası:

 loadScripts() {
    const dynamicScripts = [
     'https://platform.twitter.com/widgets.js',
     '../../../assets/js/dummyjs.min.js'
    ];
    for (let i = 0; i < dynamicScripts.length; i++) {
      const node = document.createElement('script');
      node.src = dynamicScripts[i];
      node.type = 'text/javascript';
      node.async = false;
      node.charset = 'utf-8';
      document.getElementsByTagName('head')[0].appendChild(node);
    }
  }

ve yapıcı içinde bu yöntemi çağırın,

constructor() {
    this.loadScripts();
}

Not: Daha fazla komut dosyasının dinamik olarak yüklenmesi için bunları dynamicScriptsdiziye ekleyin .


3
Söylemeliyim ki, bu basit görünüyor ama iyi çalışıyor, uygulaması çok kolay :-)
Pierre

3
Bu tür komut dosyası yerleştirmeyle ilgili sorun, Angular bir SPA olduğundan, komut dosyası etiketini DOM'dan kaldırdıktan sonra bile bu komut dosyalarının temelde tarayıcı önbelleğinde kalmasıdır.
j4rey

1
Harika cevap! Günümü kurtardı, Angular 6 & 7 ile çalışıyor. Test Edildi!
Nadeeshan Herath

Harici js'ye veri göndermek ve harici js'den veri almak için, app.component.ts adresinden bu işlevi çağırın ve declare var d3Sankey'i kullanın: herhangi bir özellik düzeyinde modülün bileşeni. İşe yarıyor.
gnganapath

7

Bu kod parçacığını yeni oluşturucu API ile yaptım

 constructor(private renderer: Renderer2){}

 addJsToElement(src: string): HTMLScriptElement {
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = src;
    this.renderer.appendChild(document.body, script);
    return script;
  }

Ve sonra böyle çağır

this.addJsToElement('https://widgets.skyscanner.net/widget-server/js/loader.js').onload = () => {
        console.log('SkyScanner Tag loaded');
} 

StackBlitz


5

Komut dosyalarını dinamik olarak yüklemek için iyi bir yolum var! Şimdi projemde ng6, echarts4 (> 700Kb), ngx-echarts3 kullanıyorum. bunları ngx-echarts belgelerinde kullandığımda, yankıları angular.json'a içe aktarmam gerekiyor: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"] dolayısıyla oturum açma modülünde, komut dosyalarını yüklerken sayfada .js, bu büyük bir dosya! Ben istemiyorum

Bu yüzden, her modülü bir dosya olarak açısal yüklediğini düşünüyorum, js'yi önceden yüklemek için bir yönlendirici çözümleyici ekleyip modül yüklemeye başlayabilirim!

// PreloadScriptResolver.service.js

/**动态加载js的服务 */
@Injectable({
  providedIn: 'root'
})
export class PreloadScriptResolver implements Resolve<IPreloadScriptResult[]> {
  // Here import all dynamically js file
  private scripts: any = {
    echarts: { loaded: false, src: "assets/lib/echarts.min.js" }
  };
  constructor() { }
  load(...scripts: string[]) {
    const promises = scripts.map(script => this.loadScript(script));
    return Promise.all(promises);
  }
  loadScript(name: string): Promise<IPreloadScriptResult> {
    return new Promise((resolve, reject) => {
      if (this.scripts[name].loaded) {
        resolve({ script: name, loaded: true, status: 'Already Loaded' });
      } else {
        const script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = this.scripts[name].src;
        script.onload = () => {
          this.scripts[name].loaded = true;
          resolve({ script: name, loaded: true, status: 'Loaded' });
        };
        script.onerror = (error: any) => reject({ script: name, loaded: false, status: 'Loaded Error:' + error.toString() });
        document.head.appendChild(script);
      }
    });
  }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<IPreloadScriptResult[]> {
   return this.load(...route.routeConfig.data.preloadScripts);
  }
}

Sonra alt modül-yönlendirme.module.ts in içinde bu PreloadScriptResolver'ı içe aktarın:

const routes: Routes = [
  {
    path: "",
    component: DashboardComponent,
    canActivate: [AuthGuardService],
    canActivateChild: [AuthGuardService],
    resolve: {
      preloadScripts: PreloadScriptResolver
    },
    data: {
      preloadScripts: ["echarts"]  // important!
    },
    children: [.....]
}

Bu kod iyi çalışıyor ve şunları vaat ediyor: js dosyası yüklendikten sonra modül yüklenmeye başlar! bu Çözücü birçok yönlendiricide kullanabilir


Lütfen IPreloadScriptResult arayüzünün kodunu paylaşır mısınız?
Mehul Bhalala

4

Açısal bir evrensel çözüm; Bir videoyu oynatmak için bir komut dosyası yüklemeden önce belirli bir öğenin sayfada olmasını beklemem gerekiyordu.

import {Inject, Injectable, PLATFORM_ID} from '@angular/core';
import {isPlatformBrowser} from "@angular/common";

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

  constructor(
    @Inject(PLATFORM_ID) private platformId: Object,
  ) {
  }

  load(scriptUrl: string) {
    if (isPlatformBrowser(this.platformId)) {
      let node: any = document.createElement('script');
      node.src = scriptUrl;
      node.type = 'text/javascript';
      node.async = true;
      node.charset = 'utf-8';
      document.getElementsByTagName('head')[0].appendChild(node);
    }
  }
}

1
Bu bir şekilde tehlikeli hissettiriyor
Mustafa

4

Merhaba, Renderer2 ve elementRef'i sadece birkaç satır kodla kullanabilirsiniz:

constructor(private readonly elementRef: ElementRef,
          private renderer: Renderer2) {
}
ngOnInit() {
 const script = this.renderer.createElement('script');
 script.src = 'http://iknow.com/this/does/not/work/either/file.js';
 script.onload = () => {
   console.log('script loaded');
   initFile();
 };
 this.renderer.appendChild(this.elementRef.nativeElement, script);
}

onloadEğer ngOnInit aramaları yapmak zorunda IF_FUNCTION komut yüklendikten sonra komut işlevleri çağırmak için kullanılabilir, bu) (çok yararlıdır


2

@ rahul-kumar'ın çözümü benim için iyi çalışıyor, ancak yazımdaki javascript işlevimi çağırmak istedim

foo.myFunctions() // works in browser console, but foo can't be used in typescript file

Yazı tipimde ilan ederek düzelttim

import { Component } from '@angular/core';
import { ScriptService } from './script.service';
declare var foo;

Ve şimdi, ben çağırabilir foo benim typecript dosyasında hiçbir yerinde


Eğer birden çok komut dosyasını içe aktarırsam foo, foo1, foo2 ve yalnızca yürütme sırasında bildirimin dinamik olarak nasıl yapılacağını biliyorum?
natrayan

2

Benim durumumda, ben her iki yükledim jsve css visjsinşaat büyük - Yukarıdaki tekniği kullanarak dosyaları. Yeni işlevi çağırıyorumngOnInit()

Not: Ben olabilir değil sadece ekleyerek yüke olsun<script>ve<link>html şablon dosyasına etiketi.

loadVisJsScript() {
  console.log('Loading visjs js/css files...');
  let script = document.createElement('script');
  script.src = "../../assets/vis/vis.min.js";
  script.type = 'text/javascript';
  script.async = true;
  script.charset = 'utf-8';
  document.getElementsByTagName('head')[0].appendChild(script);    
	
  let link = document.createElement("link");
  link.type = "stylesheet";
  link.href = "../../assets/vis/vis.min.css";
  document.getElementsByTagName('head')[0].appendChild(link);    
}


CSS dosyasını harici bir web kaynağından yüklemek istiyorum. Şu anda "Yerel kaynak yüklemeye izin verilmiyor" hatasıyla karşılaşıyorum .. Lütfen önerin.
Karan

Bu yolu denedim. Komut Dosyaları dosyaları için iyi çalışmasına rağmen, Stil Sayfaları için çalışmıyor
118218

1

@ d123546 Aynı sorunla karşılaştım ve şimdi bileşende ngAfterContentInit (Lifecycle Hook) kullanarak şu şekilde çalıştırdım:

import { Component, OnInit, AfterContentInit } from '@angular/core';
import { Router } from '@angular/router';
import { ScriptService } from '../../script.service';

@Component({
    selector: 'app-players-list',
    templateUrl: './players-list.component.html',
    styleUrls: ['./players-list.component.css'],
    providers: [ ScriptService ]
})
export class PlayersListComponent implements OnInit, AfterContentInit {

constructor(private router: Router, private script: ScriptService) {
}

ngOnInit() {
}

ngAfterContentInit() {
    this.script.load('filepicker', 'rangeSlider').then(data => {
    console.log('script loaded ', data);
    }).catch(error => console.log(error));
}

1
import { Injectable } from '@angular/core';
import * as $ from 'jquery';

interface Script {
    src: string;
    loaded: boolean;
}

@Injectable()
export class ScriptLoaderService {
    public _scripts: Script[] = [];

    /**
     * @deprecated
     * @param tag
     * @param {string} scripts
     * @returns {Promise<any[]>}
     */
    load(tag, ...scripts: string[]) {
        scripts.forEach((src: string) => {
            if (!this._scripts[src]) {
                this._scripts[src] = { src: src, loaded: false };
            }
        });

        const promises: any[] = [];
        scripts.forEach(src => promises.push(this.loadScript(tag, src)));

        return Promise.all(promises);
    }

    /**
     * Lazy load list of scripts
     * @param tag
     * @param scripts
     * @param loadOnce
     * @returns {Promise<any[]>}
     */
    loadScripts(tag, scripts, loadOnce?: boolean) {
        debugger;
        loadOnce = loadOnce || false;

        scripts.forEach((script: string) => {
            if (!this._scripts[script]) {
                this._scripts[script] = { src: script, loaded: false };
            }
        });

        const promises: any[] = [];
        scripts.forEach(script => promises.push(this.loadScript(tag, script, loadOnce)));

        return Promise.all(promises);
    }

    /**
     * Lazy load a single script
     * @param tag
     * @param {string} src
     * @param loadOnce
     * @returns {Promise<any>}
     */
    loadScript(tag, src: string, loadOnce?: boolean) {
        debugger;
        loadOnce = loadOnce || false;

        if (!this._scripts[src]) {
            this._scripts[src] = { src: src, loaded: false };
        }

        return new Promise((resolve, _reject) => {
            // resolve if already loaded
            if (this._scripts[src].loaded && loadOnce) {
                resolve({ src: src, loaded: true });
            } else {
                // load script tag
                const scriptTag = $('<script/>')
                    .attr('type', 'text/javascript')
                    .attr('src', this._scripts[src].src);

                $(tag).append(scriptTag);

                this._scripts[src] = { src: src, loaded: true };
                resolve({ src: src, loaded: true });
            }
        });
    }

    reloadOnSessionChange() {
        window.addEventListener('storage', function(data) {
            if (data['key'] === 'token' && data['oldValue'] == null && data['newValue']) {
                document.location.reload();
            }
        });
    }
}

0

bir örnek olabilir

script-loader.service.ts dosyası

import {Injectable} from '@angular/core';
import * as $ from 'jquery';

declare let document: any;

interface Script {
  src: string;
  loaded: boolean;
}

@Injectable()
export class ScriptLoaderService {
public _scripts: Script[] = [];

/**
* @deprecated
* @param tag
* @param {string} scripts
* @returns {Promise<any[]>}
*/
load(tag, ...scripts: string[]) {
scripts.forEach((src: string) => {
  if (!this._scripts[src]) {
    this._scripts[src] = {src: src, loaded: false};
  }
});

let promises: any[] = [];
scripts.forEach((src) => promises.push(this.loadScript(tag, src)));

return Promise.all(promises);
}

 /**
 * Lazy load list of scripts
 * @param tag
 * @param scripts
 * @param loadOnce
 * @returns {Promise<any[]>}
 */
loadScripts(tag, scripts, loadOnce?: boolean) {
loadOnce = loadOnce || false;

scripts.forEach((script: string) => {
  if (!this._scripts[script]) {
    this._scripts[script] = {src: script, loaded: false};
  }
});

let promises: any[] = [];
scripts.forEach(
    (script) => promises.push(this.loadScript(tag, script, loadOnce)));

return Promise.all(promises);
}

/**
 * Lazy load a single script
 * @param tag
 * @param {string} src
 * @param loadOnce
 * @returns {Promise<any>}
 */
loadScript(tag, src: string, loadOnce?: boolean) {
loadOnce = loadOnce || false;

if (!this._scripts[src]) {
  this._scripts[src] = {src: src, loaded: false};
}

return new Promise((resolve, reject) => {
  // resolve if already loaded
  if (this._scripts[src].loaded && loadOnce) {
    resolve({src: src, loaded: true});
  }
  else {
    // load script tag
    let scriptTag = $('<script/>').
        attr('type', 'text/javascript').
        attr('src', this._scripts[src].src);

    $(tag).append(scriptTag);

    this._scripts[src] = {src: src, loaded: true};
    resolve({src: src, loaded: true});
  }
 });
 }
 }

ve kullanım

ilk enjeksiyon

  constructor(
  private _script: ScriptLoaderService) {
  }

sonra

ngAfterViewInit()  {
this._script.loadScripts('app-wizard-wizard-3',
['assets/demo/default/custom/crud/wizard/wizard.js']);

}

veya

    this._script.loadScripts('body', [
  'assets/vendors/base/vendors.bundle.js',
  'assets/demo/default/base/scripts.bundle.js'], true).then(() => {
  Helpers.setLoading(false);
  this.handleFormSwitch();
  this.handleSignInFormSubmit();
  this.handleSignUpFormSubmit();
  this.handleForgetPasswordFormSubmit();
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.