Angular2 เทียบเท่ากับ $ document.ready ()


87

คำถามง่ายๆฉันหวังว่า

ฉันต้องการเรียกใช้สคริปต์เมื่อใช้งาน Angular2 ที่เทียบเท่ากับ $ document.ready () วิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้คืออะไร?

ฉันได้ลองวางสคริปต์ในตอนท้ายของ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

ตามที่ระบุไว้สคริปต์. 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 - บันทึก -D @ types / jquery จากนั้นเมื่อฉันพยายามนำเข้าในโมดูล (เนื่องจากฉัน ได้รับข้อความจากกล่องเครื่องมือที่ไม่ทราบว่า $ จาก jQuery) ใน Component.ts ของฉันมันบอกว่าข้อความแรกของฉัน! ฉันหวังว่าคำอธิบายของฉันจะถูกต้องขอขอบคุณอีกครั้งสำหรับความช่วยเหลือทั้งหมดที่ชุมชนนี้มอบให้ฉัน! btw: นี่เป็นข้อความจริงแรกของฉันดังนั้นฉันหวังว่าจะเขียนข้อความดีๆ
Alexandre Saison

คำตอบ:


37

คุณสามารถเริ่มเหตุการณ์ด้วยตัวคุณเองในngOnInit()องค์ประกอบรากเชิงมุมของคุณแล้วฟังเหตุการณ์นี้นอก 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
Boris

1
@ บอริสมันไม่ได้พาฉันไปไกลมากฉันกลัว
คริส

9
ngAfterViewInit() { ... }จากนั้นคุณเพียงแค่ใช้รหัสในการ ไม่จำเป็นต้องยิงเหตุการณ์
GünterZöchbauer

66

คัดลอกคำตอบจาก 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
วิธีนี้อาจได้ผล แต่อาจไม่ใช่แนวทางปฏิบัติที่ดีที่สุด สิ่งที่จะเป็นที่ดีคือมีทั้งหมดของรหัสภายนอกห่อในบางทั่วโลก แต่ฟังก์ชั่น namespaced 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
หวานเนียน!
แซม

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 '$'.เมื่อฉันพยายามทำตามตัวอย่างนี้?
กิน - นอน - รหัส

3
@ กิน - นอน - รหัสฉันคิดว่าคุณต้องใช้การพิมพ์ jQuery แล้วnpm install @types/jquery -Dลองยิงดูสิ? : D
realappie

4

ในการใช้ jQuery ภายใน Angular ให้ประกาศเฉพาะ $ ดังต่อไปนี้: ประกาศ var $: any;


คุณวางสิ่งนี้ไว้ที่ไหน
Dan Chase

@DanChase คุณสามารถวางไว้หลังจากการนำเข้าของห้องสมุดในชั้นเรียน
Ilir Hushi

ดูบทความดีๆนี้สำหรับการไม่รวม jquery usinng angular-cli: medium.com/@swarnakishore/…
Pavel

3

คำตอบที่ยอมรับนั้นไม่ถูกต้องและไม่มีเหตุผลที่จะยอมรับคำตอบเมื่อพิจารณาคำถาม

ngAfterViewInit จะทริกเกอร์เมื่อ DOM พร้อม

เสียงสะอื้น ngOnInit จะทริกเกอร์เมื่อคอมโพเนนต์ของเพจเริ่มสร้างขึ้นเท่านั้น


1
พยายามอธิบายคำตอบของคุณให้ชัดเจนมากขึ้นเท่านั้นและหากคุณคิดว่าคำตอบบางคำไม่ถูกต้องให้พิจารณาแสดงความคิดเห็นในคำถามนั้นแทน
Zeeshan Adil

ไม่มีปัญหาเพียงแค่พยายามทำให้คำตอบของคุณชัดเจนขึ้นเพื่อช่วยเหลือผู้คนมากขึ้น ด้วยตัวอย่างโค้ดที่เรียบง่าย
Zeeshan Adil

0

ในไฟล์ ไฟล์main.ts bootstrapหลังจาก DOMContentLoaded ดังนั้นเชิงมุมจะโหลดเมื่อ 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));
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.