$ document.ready()に相当するAngular2


87

簡単な質問です。

$ document.ready()に相当するAngular2が起動されたときにスクリプトを実行したいと思います。これを達成するための最良の方法は何ですか?

スクリプトを最後に配置しよう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

前述のように、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'を解決できませんnpminstall --save -D @ types / jqueryを使用してインストールしましたが、モジュールにインポートしようとすると(私のComponent.tsでツールボックスから$を知らないというメッセージを受け取りました)それは私の最初のメッセージを言います!私の説明が正しいことを願っていますこのコミュニティが私に与えてくれたすべての助けにもう一度感謝します!ところで:これは私の最初の本当のメッセージなので、良いメッセージを書きたいと思っています
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はまったく新しいです
Chris

できれば、onInitが発生したときにjsファイルをロードできるようにしたいと思います。このファイルには、(使用しているhtmlテンプレートからの)すべてのドキュメント対応コードが含まれており、jsに含まれているため、ng2を.tsで記述しているため、コピーして貼り付けることはできません
Chris

ngOnInitのリファレンスを確認してください。
ボリス

1
@Borisそれは私をそれほど遠くに連れて行かない私は恐れています
クリス

9
次に、でコードを実行しますngAfterViewInit() { ... }。イベントを発生させる必要はありません。
ギュンターZöchbauer

66

クリスからの答えをコピーする:

動作しました:

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 2016年

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コンポーネントに変えることができます。
zlatko 2016

1
私はこれに反対票を投じていませんが、この方法ではDOM要素に到達できます。ただし、element.css( 'height')を取得しようとすると、0pxが返されます。したがって、cssの設定には使用できません。
ブラスト2017

それは私にとって完璧に機能しました:)この段階では、あなたはすでにDOMを持っていると思いますが、画像のように、まだすべてのソースがロードされていない可能性があります。つまり、とまったく同じ$document.ready()です。
アフィルノスト2018

1
甘くてなめらか!
サム

17

私はこのソリューションを使用したので、jQuery $ .getScript関数以外のコンポーネント内にカスタムjsコードを含める必要はありませんでした。

注: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 2017


3

受け入れられた答えは正しくなく、質問を考慮してそれを受け入れることは意味がありません

ngAfterViewInitは、DOMの準備ができたときにトリガーされます

ngOnInitは、ページコンポーネントの作成が開始されたときにトリガーされます


1
回答では解決策についてのみ明確にするようにしてください。一部の回答が正しくないと思われる場合は、代わりにその質問にコメントすることを検討してください。
Zeeshan Adil 2018

問題ありません。より多くの人を助けるために、答えをより明確にするようにしてください。ミニマリストのコード例で。
Zeeshan Adil 2018

0

あなたにmain.tsのDOMが完全にロードされるときにDOMContentLoaded後のファイルのブートストラップの角度がロードされますので。

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.