Angular2 еквівалент $ document.ready ()


86

Сподіваюся, просте запитання.

Я хочу запустити сценарій, коли запускається еквівалент Angular2 $ document.ready (). Який найкращий спосіб цього досягти?

Я спробував поставити сценарій наприкінці index.html, але, як я дізнався, це не працює! Я вважаю, що він повинен входити в якусь декларацію компонента?

Чи можна запустити завантаження сценарію з .jsфайлу?

EDIT - Код:

У моє додаток введені такі плагіни 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, а потім, коли я намагаюся імпортувати його в модуль (через те, що я отримав повідомлення з набору інструментів, що він не знає $ від 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
Кріс

Бажано, я хотів би мати можливість завантажувати файл js, коли виникає onInit. Цей файл має весь мій готовий код документа (із використовуваного вами HTML-шаблону) і знаходиться у js, тому я не можу просто скопіювати його, тому що пишу ng2 у .ts
Кріс,

Перевірте посилання на ngOnInit.
Борис

1
@Boris, це мене далеко не заносить, боюся
Кріс,

9
Потім ви просто запускаєте код ngAfterViewInit() { ... }. Не потрібно запускати подію.
Günter Zöchbauer

64

Копіюючи відповідь від Кріса:

Зрозуміло:

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.
Златко

1
Я не підтримую це, але за допомогою цього методу я можу досягти елементів DOM. Однак, коли я намагаюся отримати element.css ('висота'), він повертає мені 0px. Тому я не можу використовувати його для встановлення css.
Вибух

У мене це спрацювало прекрасно :) Я думаю, на цьому етапі ви вже маєте DOM, але, можливо, ще не завантажені всі джерела, як зображення. Отже, це точно так $document.ready().
Аффільність

1
Солодко і гладко!
Сем

17

Я пішов із цим рішенням, тому мені не довелося включати свій власний код js до компонента, крім функції jQuery $ .getScript .

Примітка: Має залежність від jQuery. Тож вам знадобляться типізація jQuery та jQuery.

Я виявив, що це хороший спосіб обійти користувацькі файли js або постачальника, які не мають доступних типів, так що TypeScript не кричить на вас, коли ви заходите запускати програму.

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

4

Для того, щоб використовувати jQuery всередині Angular, оголосіть $ наступним чином: оголосіть var $: any;


куди ти це кладеш?
Ден Чейз,

@DanChase ви можете розмістити його після імпорту бібліотек у класі
Ilir Hushi

подивіться на цю приємну статтю про вимкнення jquery usinng angular-cli: medium.com/@swarnakishore/…
Павло,

3

прийнята відповідь не є правильною, і не має сенсу приймати її, розглядаючи питання

ngAfterViewInit спрацює, коли DOM буде готовий

whine ngOnInit спрацює, коли компонент сторінки тільки починає створюватися


1
Постарайтеся бути дуже чіткими лише щодо свого рішення у своїй відповіді, і якщо ви вважаєте, що якась відповідь не є правильною, подумайте прокоментувати це питання.
Zeeshan Adil

немає проблем, просто спробуйте зробити свою відповідь більш зрозумілою, щоб допомогти більшій кількості людей. з мінімалістичним прикладом коду.
Zeeshan Adil

0

У вашому файлі main.ts bootstrap після DOMContentLoaded так що angular завантажиться, коли DOM буде повністю завантажений.

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));
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.