$ Document.ready () 'nin Angular2 eşdeğeri


87

Umarım basit bir soru.

$ Document.ready () 'nin Angular2 eşdeğeri çalıştırıldığında bir komut dosyası çalıştırmak istiyorum. Bunu başarmanın en iyi yolu nedir?

Senaryoyu sonuna koymayı denedim index.htmlama öğrendiğim gibi bu işe yaramıyor! Bir tür bileşen beyanına girmesi gerektiğini anlıyorum?

Komut .jsdosyasını bir dosyadan çalıştırmak mümkün mü ?

DÜZENLE - Kod:

Uygulamama aşağıdaki js ve css eklentileri eklenmiştir ( Foundry html temasından ).

    <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

Belirtildiği gibi, scripts.js her şeyi 'somutlaştırır' ve bu nedenle Angular hazır olduktan sonra çalıştırılması gerekir. script.js

Çalışıyor:

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
    }

Birkaç saatlik araştırmadan sonra hala aynı sorunu yaşıyorum. > Modül bulunamadı: Hata: '@ types / jquery' çözülemiyor. Npm install --save -D @ types / jquery ile yükledim, sonra Modülde içe aktarmaya çalıştığımda (çünkü Araç kutusundan Component.ts dosyamda $ from jQuery'yi bilmediğine dair bir Mesaj aldım, ilk mesajımı söylüyor! Umarım açıklamalarım doğrudur Bu topluluğun bana verdiği tüm yardımlar için tekrar teşekkürler! btw: Bu benim ilk gerçek mesajım bu yüzden iyi bir mesaj yazmayı umuyorum
Alexandre Saison

Yanıtlar:


37

Kendiniz bir olay başlatabilirsiniz ngOnInit()Angular kök bileşeninizden tetikleyebilir ve ardından bu olayı Angular dışında dinleyebilirsiniz.

Bu Dart kodu (TypeScript bilmiyorum) ama çevirmesi zor olmamalı

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

Tamam mükemmel. Böyle bir kod için hızlı bir örnek verebilir misiniz? Maalesef ng2'ye oldukça yeni
Chris

Tercihen onInit gerçekleştiğinde bir js dosyası yükleyebilmeyi isterim. Bu dosyada tüm belge hazır kodum var (kullandığım bir html şablonundan) ve js'de, bu yüzden onu kopyalayıp yapıştıramıyorum çünkü ng2'yi .ts olarak yazıyorum
Chris

NgOnInit için referansı kontrol edin .
Boris

1
@Boris beni çok uzağa götürmüyor korkarım
Chris

9
Ardından kodu çalıştırırsınız ngAfterViewInit() { ... }. Bir olayı ateşlemeye gerek yok.
Günter Zöchbauer

66

Yanıtı Chris'ten kopyalamak:

Çalışıyor:

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
Neden olumsuz oy kullandığından emin değilim. Bu benim için çalıştı, ancak aynı zamanda çalıştırmaya çalıştığım eski JS kodu ile görünüm derleyicisi arasında bir yarış başlattı. Kullanmayı bıraktım AfterViewChecked, ama yine de, işte beni doğru yöne yönlendirmek için bir olumlu oy.
lukiffer

1
Bu işe yarayabilir, ancak en iyi uygulama olmayabilir. Daha iyi olan şey, tüm harici kodun bazı global, ancak iyi isim alanlı bir işleve sarılmış olmasıdır, sonra bu işlevi den çağırın ngAfterViewInit(). Örn window.MY_APP = {}; MY_APP.init = function () {/*copy all that script.js here*/ }. Ardından bileşeninizde,import ...; declare var MY_APP: any; class HomeComponent() { ngAfterViewInit() { MY_APP.init(); } } Ancak sonuç olarak hala bir angular2 uygulamanızın olmamasıdır - script.js temelde eski bir jquery sayfasıdır. Çoğunu NG2 bileşenlerine dönüştürebilirsiniz.
Zlatko

1
Bunu olumsuz oylamıyorum ama bu yöntemde DOM öğelerine ulaşabiliyorum. Ancak element.css ('yükseklik') almaya çalıştığımda bana 0px geri dönüyor Bu yüzden css'yi ayarlamak için kullanamıyorum.
patlama

Benim için mükemmel çalıştı :) Sanırım, bu aşamada DOM'a sahipsiniz, ancak görüntüler gibi tüm kaynakları henüz yüklememiş olabilirsiniz. Yani aynen öyle $document.ready().
Affilnost

1
Tatlı ve pürüzsüz!
Sam

17

Bu çözüme gittim, böylece özel js kodumu jQuery $ .getScript işlevi dışındaki bileşene dahil etmek zorunda kalmadım .

Not: jQuery'ye bağımlıdır. Bu yüzden jQuery ve jQuery yazımlarına ihtiyacınız olacak.

Bunun, uygulamanızı başlatmaya gittiğinizde TypeScript'in size çığlık atmadığı şekilde yazımları olmayan özel veya satıcı js dosyalarında dolaşmanın iyi bir yolu olduğunu buldum.

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

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

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

Güncelle Aslında benim senaryomda, OnInit yaşam döngüsü olayı daha iyi çalıştı, çünkü görünümler yüklendikten sonra komut dosyasının yüklenmesini engelledi, bu, ngAfterViewInit için geçerliydi ve bu, komut dosyası yüklenmeden önce görünümün yanlış öğe konumlarını göstermesine neden oldu.

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

Ben olsun Cannot find name '$'.ben bu örneği izlemeye çalışırken?
yemek uyku kodu

3
@ eat-sleep-code Sanırım jQuery yazımlarına ihtiyacınız var, npm install @types/jquery -Dbir şans vermeye ne dersiniz ? : D
realappie


3

kabul edilen cevap doğru değil ve soruyu dikkate alarak kabul etmenin bir anlamı yok

ngAfterViewInit, DOM hazır olduğunda tetiklenecektir

whine ngOnInit, sayfa bileşeni henüz oluşturulmaya başladığında tetiklenecektir


1
Cevabınızda yalnızca çözümünüz hakkında çok net olmaya çalışın ve bir cevabın doğru olmadığını düşünüyorsanız, bunun yerine bu soru üzerine yorum yapmayı düşünün.
Zeeshan Adil

hayır Sorun, daha fazla insana yardım etmek için cevabınızı daha net hale getirmeye çalışın. minimalist bir kod örneği ile.
Zeeshan Adil

0

Senin içinde main.ts DOM tamamen yüklendiğinde DOMContentLoaded sonra dosya bootstrap açısal yükleyecektir yüzden.

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));
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.