Angular2 setara dengan $ document.ready ()


87

Pertanyaan sederhana, saya harap.

Saya ingin menjalankan skrip ketika Angular2 yang setara dengan $ document.ready () dipecat. Apa cara terbaik untuk mencapai ini?

Saya sudah mencoba meletakkan skrip di akhir index.html, tetapi setelah saya tahu, ini tidak berhasil! Saya menganggap itu harus masuk dalam semacam deklarasi komponen?

Apakah mungkin untuk menjalankan memuat skrip dari .jsfile?

EDIT - Kode:

Saya memiliki plugin js dan css berikut yang dimasukkan ke dalam aplikasi saya (dari tema html Foundry ).

    <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

Seperti dicatat, scripts.js 'instantiates' semuanya, dan dengan demikian perlu dijalankan setelah Angular siap. script.js

Berhasil:

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
    }

setelah beberapa jam penelitian, saya masih mendapatkan masalah yang sama. > Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan '@ types / jquery' Saya menginstalnya dengan npm install --save -D @ types / jquery, lalu ketika saya mencoba mengimpornya di Modul (karena saya mendapat Pesan dari toolbox yang tidak mengetahui $ dari jQuery) di Component.ts saya dikatakan pesan pertama saya! Saya harap penjelasan saya diperbaiki. Sekali lagi terima kasih atas semua bantuan yang diberikan komunitas ini kepada saya! btw: Ini adalah pesan nyata pertama saya jadi saya berharap bisa menulis yang bagus
Alexandre Saison

Jawaban:


37

Anda dapat mengaktifkan acara sendiri di ngOnInit()komponen root Angular Anda dan kemudian mendengarkan acara ini di luar Angular.

Ini adalah kode Dart (saya tidak tahu TypeScript) tetapi seharusnya tidak sulit untuk diterjemahkan

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

Oke sempurna. Bisakah Anda memberikan contoh singkat dari kode tersebut? Maaf, tapi cukup baru untuk ng2
Chris

Lebih disukai, saya ingin memuat file js saat onInit terjadi. File ini memiliki semua kode siap dokumen saya (dari template html yang saya gunakan) dan ada di js, jadi saya tidak bisa begitu saja menyalinnya karena saya menulis ng2 dalam .ts
Chris

Periksa referensi untuk ngOnInit.
Boris

1
@ Boris itu tidak membawa saya terlalu jauh, saya takut
Chris

9
Kemudian Anda cukup menjalankan kode ngAfterViewInit() { ... }. Tidak perlu menyalakan acara.
Günter Zöchbauer

66

Menyalin jawaban dari Chris:

Berhasil:

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
Tidak yakin mengapa suara negatifnya. Ini berfungsi untuk saya, tetapi juga memperkenalkan balapan antara kode JS lama yang saya coba jalankan dan kompiler tampilan. Saya akhirnya menggunakan AfterViewChecked, tetapi tetap saja, inilah suara positif untuk mengarahkan saya ke arah yang benar.
lukiffer

1
Ini mungkin berhasil tetapi mungkin bukan praktik terbaik. Apa yang lebih baik adalah memiliki semua kode eksternal yang dibungkus dalam beberapa fungsi namespaced global, tetapi baik, kemudian memanggil fungsi ini dari ngAfterViewInit(). Mis window.MY_APP = {}; MY_APP.init = function () {/*copy all that script.js here*/ }. Kemudian di komponen Anda, import ...; declare var MY_APP: any; class HomeComponent() { ngAfterViewInit() { MY_APP.init(); } }Tapi intinya adalah Anda tidak memiliki aplikasi angular2 - script.js Anda pada dasarnya adalah halaman jquery jadul. Anda dapat mengubah sebagian besar menjadi komponen NG2.
Zlatko

1
Saya tidak merendahkan ini tetapi dalam metode ini saya dapat menjangkau elemen DOM. Namun ketika saya mencoba untuk mendapatkan element.css ('height') kembali ke saya 0px Jadi saya tidak dapat menggunakannya untuk pengaturan css.
Ledakan

Ini bekerja untuk saya dengan sempurna :) Saya rasa, pada tahap ini Anda sudah memiliki DOM, tetapi mungkin belum semua sumber dimuat, seperti gambar. Jadi persis seperti itu $document.ready().
Affilnost

1
Manis dan lembut!
Sam

17

Saya menggunakan solusi ini jadi saya tidak perlu menyertakan kode js kustom saya di dalam komponen selain fungsi jQuery $ .getScript .

Catatan: Memiliki ketergantungan pada jQuery. Jadi, Anda perlu mengetik jQuery dan jQuery.

Saya telah menemukan ini adalah cara yang baik untuk menyiasati file js kustom atau vendor yang tidak memiliki pengetikan yang tersedia dengan cara itu TypeScript tidak berteriak pada Anda ketika Anda pergi untuk memulai aplikasi Anda.

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

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

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

Perbarui Sebenarnya dalam skenario saya, peristiwa siklus hidup OnInit bekerja lebih baik karena mencegah skrip dimuat setelah tampilan dimuat, yang merupakan kasus ngAfterViewInit, dan yang menyebabkan tampilan menampilkan posisi elemen yang salah sebelum pemuatan skrip.

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

Saya mengerti Cannot find name '$'.ketika saya mencoba mengikuti contoh ini?
kode makan-tidur

3
@ eat-sleep-code Saya pikir Anda memerlukan pengetikan jQuery, bagaimana kalau npm install @types/jquery -Dmencoba? : D
realappie

4

Untuk menggunakan jQuery di dalam Angular hanya mendeklarasikan $ sebagai berikut: mendeklarasikan var $: any;


dimana kamu meletakkan ini?
Dan Chase

@DanChase Anda dapat menempatkannya setelah impor perpustakaan di kelas
Ilir Hushi

lihat artikel bagus ini untuk tidak menyertakan jquery menggunakan angular-cli: medium.com/@swarnakishore/…
Pavel

3

jawaban yang diterima tidak benar, dan tidak masuk akal untuk menerimanya mengingat pertanyaan itu

ngAfterViewInit akan terpicu saat DOM sudah siap

whine ngOnInit akan terpicu saat komponen halaman baru mulai dibuat


1
Cobalah untuk sangat jelas hanya tentang solusi Anda dalam jawaban Anda dan jika menurut Anda beberapa jawaban tidak benar, pertimbangkan untuk mengomentari pertanyaan itu sebagai gantinya.
Zeeshan Adil

tidak masalah, coba buat jawaban Anda lebih jelas untuk membantu lebih banyak orang. dengan contoh kode minimalis.
Zeeshan Adil

0

Di file main.ts Anda, bootstrap setelah DOMContentLoaded, jadi angular akan dimuat saat DOM dimuat penuh.

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));
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.