Angular에서 외부 스크립트를 동적으로로드하는 방법은 무엇입니까?


150

<script>index.html에 직접 태그 를 추가하지 않고 추가 라이브러리와 함께 외부 라이브러리를 구성하는이 모듈이 있습니다.

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 {...}

나는 알 importES6에 의한 사양은 정적 및 타이프 라이터가 아니라 런타임에보다 transpiling 동안 해결입니다.

어쨌든 file.js가 CDN 또는 로컬 폴더에서로드되도록 구성 할 수 있습니까? Angular 2에게 스크립트를 동적으로로드하도록 지시하는 방법은 무엇입니까?


답변:


61

system.js를 사용 System.import()하는 경우 런타임에 사용할 수 있습니다 .

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

웹팩을 사용하는 경우 다음을 통해 강력한 코드 분할 지원을 최대한 활용할 수 있습니다 require.ensure.

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

1
구성 요소에서 모듈 로더를 사용해야하는 것처럼 보입니다. System로더의 미래 이기 때문에 괜찮습니다 .
CallMeLaNN

6
TypeScript Plugin for Sublime Text행복하지 않습니다 System: 타이프 스크립트 코드 Cannot find name 'System'만 transpiling 실행시 오류없이. Angular2System스크립트 파일이 모두에 이미 추가되었습니다 index.html. 어쨌든에 및 플러그인 행복하게? importSystem
CallMeLaNN

1
그러나 system.js를 사용하지 않으면 어떻게 될까요!
Murhaf Sousli

2
@drewmoore 내가 왜 그렇게 말했는지 기억이 안나요 require()/ import지금 답으로 잘 작동해야합니다, +1
Murhaf Sousli

9
내가 말할 수있는 것에서이 옵션은 인터넷의 스크립트에서는 작동하지 않으며 로컬 파일에서만 작동합니다. 이것은 원래 질문에 대답하지 않은 것 같습니다.
WillyC

139

다음 기술을 사용하여 Angular 프로젝트에서 요청시 JS 스크립트 및 라이브러리를 동적으로로드 할 수 있습니다.

script.store.ts 는 로컬 또는 원격 서버의 스크립트 경로 와 스크립트를 동적으로로드하는 데 사용되는 이름을 포함 합니다.

 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 는 스크립트 로딩을 처리하고 script.service.ts그대로 복사하는 주입 가능한 서비스 입니다.

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필요할 때마다 이것을 주입하고 다음 과 같이 js libs를로드하십시오.

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

7
이것은 훌륭하게 작동합니다. 초기로드 크기에서 1MB 이상 면도 – 많은 라이브러리가 있습니다!
Our_Benefactors 2016 년

2
내가 너무 빨리 말한 것 같아 이 솔루션은 iOS Safari에서 작동하지 않습니다.
Our_Benefactors 2016 년

스크립트를로드 한 후 dom의 머리에 추가되는지 확인
Rahul Kumar

어쩌면 나는 정확하게 주사하지 않지만, 점점this.script.load is not a function
Towelie

감사. 이것은 작동하지만 다른 모든 구성 요소에 스크립트 (배경 애니메이션) 가로 드됩니다. 첫 번째 구성 요소 (로그인 페이지)에만로드하고 싶습니다. 그것을 달성하기 위해 무엇을 할 수 있습니까? 감사합니다
Joel Azevedo

47

이 작동 할 수 있습니다. 이 코드는 버튼을 클릭하면 html 파일에 <script>태그를 동적으로 추가합니다 head.

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
감사합니다. 이제 ngonit 메소드를 사용하여 페이지로드에로드 할 수 있습니다. 따라서 버튼 클릭이 필요하지 않습니다.
Niraj

나는 같은 방식으로 사용하고 있지만 나를 위해 일하지 않았습니다. U 같은 것을 도와주세요 수 있습니까 ?? this.loadJs ( "javascriptfile 경로"); 공개 loadjs (파일) {let node = document.createElement ( 'script'); node.src = 파일; node.type = 'text / javascript'; node.async = true; node.charset = 'utf-8'; document.getElementsByTagName ( 'head') [0] .appendChild (node); }
Mitesh Shah

클릭 또는 페이지로드시이를 수행하려고합니까? 결과 나 오류에 대해 더 말씀해 주시겠습니까?
ng-darren

안녕하세요, 나는 이것을 구현하고 잘 작동했지만 new Promise해결되지 않았습니다. Promise수입해야 한다고 말해 줄 수 있습니까 ?
user3145373 ツ

안녕하세요, Promise를 사용할 때 특별한 것을 가져 오지 않았습니다.
ng-darren

23

@rahul kumars 답변을 수정하여 대신 Observables를 사용합니다.

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
로 설정하는 것을 잊었 async습니다 true.
Will Huang

스크립트를 추가하고 경로를 탐색 할 때 질문이 있습니다. 집에 스크립트를로드하고 집으로 돌아가서 다시 돌아 온다고 말하면 현재 스크립트를 다시 초기화하는 방법이 있습니까? 이전에로드 한 것을 제거하고 다시로드하고 싶습니다. 대단히 감사합니다
d123546

@ d123546 네, 가능하다면 가능합니다. 그러나 스크립트 태그를 제거하는 논리를 작성해야합니다. 여기를보세요 : stackoverflow.com/questions/14708189/…
Joel

고마워 Joel, 그러나 어떻게 든 스크립트에 의해 초기화 된 기능을 제거하는 방법이 있습니까? 현재 jquery 슬라이더를 초기화하는 스크립트를로드 중이므로 첫 번째 경로가 제대로로드되면 다른 경로로 이동하여 다시 경로로 돌아갈 때 스크립트가 두 번로드되고 슬라이더가 표시되므로 angular4 프로젝트에서 문제가 발생했습니다. 더 이상로드되지 않습니다 :( 이것에 대해 조언 해 주시겠습니까?
d123546

1
라인에 오류가 있습니다 private scripts: {ScriptModel}[] = [];. 그것은해야한다private scripts: ScriptModel[] = [];
크리스 헤인즈

20

또 다른 옵션은 그 문제에 대한 scriptjs패키지 를 활용 하는 것입니다.

모든 URL에서 주문형 스크립트 리소스를로드 할 수 있습니다.

패키지를 설치하십시오 :

npm i scriptjs

정의를위한 입력scriptjs :

npm install --save @types/scriptjs

그런 다음 가져 오기 $script.get()방법 :

import { get } from 'scriptjs';

마지막으로 Google Maps 라이브러리에서는 스크립트 리소스를로드합니다.

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

데모


공유해 주셔서 감사하지만 비동기 지연과 같은 URL로 추가 속성을 추가하는 방법 ?? 위의 라이브러리를 사용하여이 스크립트를로드하는 방법을 안내해 주시겠습니까? <script type = 'text / javascript'src = ' bing.com/api/maps/mapcontrol?branch=release '비동기 지연> </ script>
Pushkar Rathod

제목 줄이 동일하기 때문에 나는 여기서 만 대답을
바라고있다

훌륭하지만 npm install --save @ types / scriptjs 대신 npm install --save-dev @ types / scriptjs (또는 npm i -D @ types / scriptjs) 여야합니다.
Youness Houdass

18

파일에 다음 과 같이 여러 스크립트를 동적으로 로드 수 있습니다 component.ts.

 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);
    }
  }

생성자 안에서이 메소드를 호출합니다.

constructor() {
    this.loadScripts();
}

참고 : 더 많은 스크립트를 동적으로로드하려면 dynamicScripts배열에 추가하십시오 .


3
말하자면, 이것은 단순 해 보이지만 잘 작동하고 구현하기가 매우 쉽습니다 :-)
Pierre

3
이 유형의 스크립트 삽입의 문제점은 Angular가 SPA이므로이 스크립트는 기본적으로 DOM에서 scripts 태그를 제거한 후에도 브라우저 캐시에 유지된다는 것입니다.
j4rey

1
멋진 답변! 내 하루를 저장, 그것은 Angular 6 & 7에서 작동합니다.
Nadeeshan Herath

외부 js로 데이터를 보내고 외부 js에서 데이터를 가져 오려면 app.component.ts에서이 함수를 호출하고 모든 기능 레벨 모듈의 구성 요소에서 선언 var d3Sankey : any를 사용하십시오. 작동합니다.
gnganpath

5

새로운 렌더러 API 로이 코드 스 니펫을 수행했습니다.

 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;
  }

그리고 이렇게 불러

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

스택 블리츠


4

스크립트를 동적으로로드하는 좋은 방법이 있습니다! 이제 프로젝트에서 ng6, echarts4 (> 700Kb), ngx-echarts3을 사용합니다. ngx-echarts의 문서에서 사용할 때 angular.json에서 "escripts"를 가져와야합니다 : "scripts": [ "./ node_modules / echarts / dist / echarts.min.js"] 따라서 스크립트를로드하는 동안 로그인 모듈의 페이지 .js, 이것은 큰 파일입니다! 나는 그것을 원하지 않습니다.

그래서 각도가 각 모듈을 파일로로드한다고 생각합니다 .js를 미리로드하기 위해 라우터 리졸버를 삽입 한 다음 모듈 로딩을 시작할 수 있습니다!

// 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);
  }
}

그런 다음 submodule-routing.module.ts에서이 PreloadScriptResolver를 가져옵니다.

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

이 코드는 잘 작동하며 약속 : js 파일이로드 된 후 모듈이로드를 시작합니다! 이 리졸버는 많은 라우터에서 사용할 수 있습니다


IPreloadScriptResult 인터페이스의 코드를 공유 할 수 있습니까?
Mehul Bhalala

3

Angular 범용 솔루션; 비디오를 재생하기 위해 스크립트를로드하기 전에 특정 요소가 페이지에 나타날 때까지 기다려야했습니다.

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
어쨌든 기분이 좋지 않습니다
Mustafa

2

@ rahul-kumar의 솔루션은 저에게 효과적이지만 typescript에서 Javascript 함수를 호출하고 싶었습니다.

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

나는 그것을 타이프 스크립트로 선언하여 고쳤다.

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

그리고 지금, 나는 typecript 파일의 어느 곳에서나 foo 를 호출 할 수 있습니다


여러 스크립트 foo, foo1, foo2를 가져 오면 실행 시간 동안 동적으로 선언을 수행하는 방법을 알고 있습니까?
natrayan

2

필자의 경우 위의 기술을 사용하여 파일 jscss visjs파일을 모두로드했습니다 . 나는 새로운 함수를ngOnInit()

참고 : HTML 템플릿 파일에 단순히and태그를추가하여로드할 수 없었 습니다.<script><link>

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 파일을로드하고 싶습니다. 현재 "로컬 리소스를로드 할 수 없습니다"라는 오류가 발생했습니다. 제안하십시오.
Karan

나는 이런 식으로 시도했다. 스크립트 파일에서는 잘 작동하지만 스타일 시트에서는 작동하지 않습니다.
118218

2

안녕하세요, 몇 줄의 코드로 Renderer2와 elementRef를 사용할 수 있습니다 :

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);
}

onload함수는 스크립트가로드 된 후 스크립트 함수를 호출하는 데 사용될 수 있습니다. 이는 ngOnInit ()에서 호출을 수행해야하는 경우 매우 유용합니다.


1

@ d123546 나는 같은 문제에 직면하여 다음과 같이 구성 요소에서 ngAfterContentInit (Lifecycle Hook)를 사용하여 작동하게했습니다.

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

샘플은

script-loader.service.ts 파일

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});
  }
 });
 }
 }

그리고 사용법

첫 주사

  constructor(
  private _script: ScriptLoaderService) {
  }

그때

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

}

또는

    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();
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.