$ document.ready ()에 해당하는 Angular2


86

간단한 질문입니다.

$ document.ready ()에 해당하는 Angular2가 실행될 때 스크립트를 실행하고 싶습니다. 이를 달성하는 가장 좋은 방법은 무엇입니까?

의 끝에 스크립트를 넣으려고했지만 알다시피 index.html작동하지 않습니다! 나는 그것이 어떤 종류의 구성 요소 선언에 들어가야한다고 생각합니까?

.js파일 에서 스크립트로드를 실행할 수 있습니까?

수정-코드 :

내 응용 프로그램에 삽입 된 다음 js 및 css 플러그인이 있습니다 ( Foundry html 테마에서 ).

    <link href="css/themify-icons.css" rel="stylesheet" type="text/css" media="all" />
    <link href="css/bootstrap.css" rel="stylesheet" type="text/css" media="all" />
    ...


    <script src="js/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <script src="js/flexslider.min.js"></script>
    ...
    <script src="js/scripts.js"></script> //This initiates all the plugins

앞서 언급했듯이 scripts.js는 전체를 '인스턴스화'하므로 Angular가 준비된 후에 실행해야합니다. script.js

작동 :

import {Component, AfterViewInit} from 'angular2/core';

@Component({
  selector: 'home',
  templateUrl: './components/home/home.html'
})
export class HomeCmp implements AfterViewInit {


    ngAfterViewInit() {
       //Copy in all the js code from the script.js. Typescript will complain but it works just fine
    }

몇 시간의 조사 후에도 여전히 같은 문제가 발생했습니다. > 모듈을 찾을 수 없음 : 오류 : '@ types / jquery'를 해결할 수 없습니다. npm install --save -D @ types / jquery로 설치 한 다음 모듈에서 가져 오려고 할 때 (i 도구 상자에서 jQuery에서 $를 모른다는 메시지를 받았습니다) 내 Component.ts에서 내 첫 번째 메시지를 말합니다! 제 설명이 정확하길 바랍니다.이 커뮤니티가 제게 주신 모든 도움에 다시 한번 감사드립니다! btw : 이것이 제 첫 번째 진짜 메시지이므로 좋은 글을 쓰고 싶습니다
Alexandre Saison

답변:


37

ngOnInit()Angular 루트 구성 요소 에서 직접 이벤트를 시작한 다음 Angular 외부에서이 이벤트를 수신 할 수 있습니다 .

이것은 Dart 코드 (TypeScript를 모릅니다)이지만 번역하기 어렵지 않아야합니다.

@Component(selector: 'app-element')
@View(
    templateUrl: 'app_element.html',
)
class AppElement implements OnInit {
  ElementRef elementRef;
  AppElement(this.elementRef);

  void ngOnInit() {
    DOM.dispatchEvent(elementRef.nativeElement, new CustomEvent('angular-ready'));
  }
}

좋아, 완벽 해. 이러한 코드의 간단한 예를 제공 할 수 있습니까? 미안하지만, 아주 새로운 NG2에
크리스

바람직하게는 onInit가 발생할 때 js 파일을로드 할 수 있기를 원합니다. 이 파일에는 내 모든 문서 준비 코드 (내가 사용중인 html 템플릿에서 가져온)가 포함되어 있으며 js에 있으므로 .ts로 ng2를 작성하고 있기 때문에 복사 붙여 넣기 만 할 수 없습니다
Chris

ngOnInit에 대한 참조 를 확인하십시오 .
Boris

1
그것은 나를하지 않는 @Boris 아주 멀리 난 두려워
크리스

9
그런 다음 ngAfterViewInit() { ... }. 이벤트를 시작할 필요가 없습니다.
Günter Zöchbauer 2015

64

Chris의 답변 복사 :

작동 :

import {AfterViewInit} from 'angular2/core';    

export class HomeCmp implements AfterViewInit {    

    ngAfterViewInit() {
       //Copy in all the js code from the script.js. Typescript will complain but it works just fine
    }

4
왜 반대표를 던지는 지 모르겠습니다. 이것은 나를 위해 일했지만 내가 실행하려는 레거시 JS 코드와 뷰 컴파일러 사이에 경쟁을 불러 일으켰습니다. 나는 결국을 사용 AfterViewChecked했지만 모두 똑같 습니다 . 올바른 방향으로 나를 가리키는 찬성표가 있습니다.
lukiffer

1
이것은 작동 할 수 있지만 모범 사례가 아닐 수도 있습니다. 더 나은 것은 모든 외부 코드를 일부 전역이지만 네임 스페이스가 잘 지정된 함수로 래핑 한 다음이 함수를 ngAfterViewInit(). 예 window.MY_APP = {}; MY_APP.init = function () {/*copy all that script.js here*/ }. 그런 다음 구성 요소에서 import ...; declare var MY_APP: any; class HomeComponent() { ngAfterViewInit() { MY_APP.init(); } }하지만 결론은 여전히 ​​angular2 앱이 없다는 것입니다. script.js는 기본적으로 구식 jquery 페이지입니다. 대부분을 NG2 구성 요소로 바꿀 수 있습니다.
Zlatko

1
나는 이것을 반대하지 않지만이 방법으로 DOM 요소에 도달 할 수 있습니다. 그러나 element.css ( 'height')를 얻으려고하면 0px가 반환되므로 CSS 설정에 사용할 수 없습니다.
폭발

그것은 나를 위해 완벽하게 작동했습니다. :)이 단계에서 이미 DOM이 있지만 이미지와 같은 모든 소스가 아직로드되지 않았을 수 있습니다. 그래서 정확히 $document.ready().
Affilnost

1
달콤하고 부드럽습니다!
Sam

17

이 솔루션을 사용하여 jQuery $ .getScript 함수 이외의 구성 요소 내에 사용자 지정 js 코드를 포함 할 필요가 없었습니다 .

참고 : jQuery에 대한 종속성이 있습니다. 따라서 jQuery 및 jQuery 타이핑이 필요합니다.

이것은 TypeScript가 앱을 시작할 때 비명을 지르지 않는 방식으로 타이핑을 사용할 수없는 사용자 지정 또는 공급 업체 js 파일을 처리하는 좋은 방법이라는 것을 알았습니다.

import { Component,AfterViewInit} from '@angular/core'

@Component({
  selector: 'ssContent',
  templateUrl: 'app/content/content.html',
})
export class ContentComponent implements AfterViewInit  {

  ngAfterViewInit(){
    $.getScript('../js/myjsfile.js');
  }
}

실제로 업데이트 내 시나리오에서 OnInit 수명주기 이벤트는보기가로드 된 후 스크립트가로드되는 것을 막았 기 때문에 더 잘 작동했습니다. ngAfterViewInit의 경우와 마찬가지로 스크립트로드 전에보기가 잘못된 요소 위치를 표시하게합니다.

ngOnInit() {
    $.getScript('../js/mimity.js');
  }

Cannot find name '$'.이 예를 따르려고 할 때 얻 습니까?
eat-sleep-code

3
@ eat-sleep-code jQuery 타이핑이 필요하다고 생각합니다 npm install @types/jquery -D. : D
realappie


3

받아 들여진 대답은 정확하지 않으며, 질문을 고려하여 받아들이는 것이 무감각합니다.

ngAfterViewInit는 DOM이 준비되면 트리거됩니다.

ngOnInit는 페이지 구성 요소가 생성되기 시작할 때만 트리거됩니다.


1
답변에서 자신의 솔루션에 대해서만 명확하게 설명하고 일부 답변이 정확하지 않다고 생각되면 대신 해당 질문에 대한 의견을 고려하십시오.
Zeeshan Adil

문제 없습니다. 더 많은 사람들을 돕기 위해 답을 더 명확하게 만드십시오. 최소한의 코드 예제로.
Zeeshan Adil

0

당신에 main.ts의 DOM이 완전히로드 될 때 DOMContentLoaded 후 파일 부트 스트랩 각도로드 있도록.

import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}



document.addEventListener('DOMContentLoaded', () => {
  platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.log(err));
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.