Angular2 tương đương với $ document.ready ()


86

Tôi hy vọng câu hỏi đơn giản.

Tôi muốn chạy một tập lệnh khi Angular2 tương đương với $ document.ready () được kích hoạt. cách tốt nhất để đạt được điều này là gì?

Tôi đã thử đặt tập lệnh vào cuối index.html, nhưng khi tôi phát hiện ra, điều này không hoạt động! Tôi hiểu rằng nó phải đi trong một số loại khai báo thành phần?

Có thể chạy tải tập lệnh từ .jstệp không?

EDIT - Mã:

Tôi đã đưa các plugin js và css sau vào ứng dụng của mình (từ chủ đề 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

Như đã lưu ý, scripts.js 'khởi tạo' toàn bộ và do đó nó cần được chạy sau khi Angular sẵn sàng. script.js

Làm cho nó hoạt động:

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
    }

sau một số giờ nghiên cứu, tôi vẫn gặp vấn đề tương tự. > Không tìm thấy mô-đun: Lỗi: Không thể giải quyết '@ type / jquery' Tôi đã cài đặt nó với npm install --save -D @ type / jquery, sau đó khi tôi cố gắng nhập nó vào Mô-đun (do thực tế là tôi nhận được Thông báo từ hộp công cụ mà nó không biết $ từ jQuery) trong Component.ts của tôi, nó cho biết tin nhắn đầu tiên của tôi! Tôi hy vọng lời giải thích của tôi là chính xác Cảm ơn một lần nữa vì tất cả sự giúp đỡ mà cộng đồng này đã dành cho tôi! btw: Đây là thông điệp thực sự đầu tiên của tôi vì vậy tôi hy vọng sẽ viết một trong những tốt
Alexandre Saison

Câu trả lời:


37

Bạn có thể tự kích hoạt một sự kiện trong ngOnInit()thành phần gốc Angular của mình và sau đó lắng nghe sự kiện này bên ngoài Angular.

Đây là mã Dart (tôi không biết TypeScript) nhưng không khó dịch

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

OK hoàn hảo. Bạn có thể cung cấp một ví dụ nhanh về mã như vậy không? Xin lỗi, nhưng khá mới để ng2
Chris

Tốt hơn là tôi muốn có thể tải tệp js khi onInit xảy ra. Tập tin này có tất cả các tài liệu của tôi đang sẵn sàng (từ một mẫu html Tôi đang sử dụng) và đang trong js, vì vậy tôi không thể chỉ cần sao chép dán nó vào kể từ khi tôi đang viết ng2 trong .ts
Chris

Kiểm tra tham chiếu cho ngOnInit.
Boris,

1
@Boris nó không làm cho tôi rất xa Tôi sợ
Chris

9
Sau đó, bạn chỉ cần chạy mã trong ngAfterViewInit() { ... }. Không cần phải kích hoạt một sự kiện.
Günter Zöchbauer,

64

Sao chép câu trả lời từ Chris:

Làm cho nó hoạt động:

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
Không chắc tại sao các phiếu phản đối. Điều này đã làm việc cho tôi, nhưng cũng giới thiệu một cuộc chạy đua giữa mã JS cũ mà tôi đang cố gắng chạy và trình biên dịch chế độ xem. Tôi đã kết thúc việc sử dụng AfterViewChecked, nhưng tất cả đều giống nhau, đây là một sự ủng hộ vì đã chỉ cho tôi đi đúng hướng.
lukiffer

1
Điều này có thể hiệu quả nhưng nó có thể không phải là phương pháp hay nhất. Điều tốt hơn là có tất cả mã bên ngoài được bao bọc trong một số hàm toàn cục, nhưng cũng có không gian tên, sau đó gọi hàm này từ ngAfterViewInit(). Vd window.MY_APP = {}; MY_APP.init = function () {/*copy all that script.js here*/ }. Sau đó, trong thành phần của bạn, import ...; declare var MY_APP: any; class HomeComponent() { ngAfterViewInit() { MY_APP.init(); } }Nhưng điểm mấu chốt vẫn là bạn không có ứng dụng angle2 - script.js của bạn về cơ bản là một trang jquery kiểu cũ. Bạn có thể biến hầu hết nó thành các thành phần NG2.
Zlatko

1
Tôi không phản đối điều này nhưng trong phương pháp này, tôi có thể tiếp cận các phần tử DOM. Tuy nhiên, khi tôi cố lấy element.css ('height'), nó trả về cho tôi 0px Vì vậy, tôi không thể sử dụng nó để thiết lập css.
Vụ nổ

Nó hoạt động hoàn hảo đối với tôi :) Tôi nghĩ, ở giai đoạn này, bạn đã có DOM, nhưng có thể chưa tải tất cả các nguồn, như hình ảnh. Vì vậy, nó chính xác như thế nào $document.ready().
Affilnost

1
Ngọt ngào và mịn màng!
Sam

17

Tôi đã sử dụng giải pháp này để không phải đưa mã js tùy chỉnh của mình vào thành phần khác với hàm jQuery $ .getScript .

Lưu ý: Có phụ thuộc vào jQuery. Vì vậy, bạn sẽ cần jQuery và jQuery typings.

Tôi nhận thấy đây là một cách tốt để truy cập các tệp js tùy chỉnh hoặc của nhà cung cấp không có sẵn kiểu đánh máy theo cách đó TypeScript không hét vào mặt bạn khi bạn khởi động ứng dụng của mình.

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

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

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

Cập nhật Thực tế trong kịch bản của tôi, sự kiện vòng đời OnInit hoạt động tốt hơn vì nó ngăn tập lệnh tải sau khi các chế độ xem được tải, trường hợp này xảy ra với ngAfterViewInit và điều đó khiến chế độ xem hiển thị vị trí phần tử không chính xác trước khi tải tập lệnh.

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

Tôi nhận được Cannot find name '$'.khi tôi cố gắng làm theo ví dụ này?
ăn-ngủ

3
@ eat-sleep-code Tôi nghĩ bạn cần các kiểu đánh máy jQuery, npm install @types/jquery -Dvậy còn bạn thì sao? : D
realappie


3

câu trả lời được chấp nhận là không đúng và không có lý do gì để chấp nhận nó khi xem xét câu hỏi

ngAfterViewInit sẽ kích hoạt khi DOM sẵn sàng

whine ngOnInit sẽ kích hoạt khi thành phần trang chỉ bắt đầu được tạo


1
Cố gắng chỉ nói rõ ràng về giải pháp của bạn trong câu trả lời của bạn và nếu bạn cho rằng câu trả lời nào đó không đúng, hãy cân nhắc bình luận về câu hỏi đó.
Zeeshan Adil

không sao, chỉ cần cố gắng làm cho câu trả lời của bạn rõ ràng hơn để giúp được nhiều người hơn. với một ví dụ mã tối giản.
Zeeshan Adil

0

Trong tệp main.ts của bạn, bootstrap sau DOMContentLoaded vì vậy, góc cạnh sẽ tải khi DOM được tải đầy đủ.

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));
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.