如何在每个组件完成加载后在Angular 2中运行jquery函数

Jos*_*gis 22 jquery components onload document-ready angular

我已经尝试了所有生命周期钩子但无法完成所需的结果.我需要的结果是在加载这些元素(组件)中的每一个之后触发一个函数,该函数初始化用于单个页面上的不同元素的许多jquery插件.

所以我们说你有这种结构.

主页滑块小部件产品旋转器..等等

这些元素中的每一个都有自己的组件,并且都是主页父组件的子组件.

我需要的是知道所有子组件和父组件何时被加载,所以我触发一个jquery函数来初始化页面上的每个插件.

Dan*_*ber 25

您将需要使用"ngAfterViewInit"生命周期钩子,通过导入AfterViewInit(https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#afterview).你可以使用它,如下所示:

安装:

    tsd install jquery --save
Run Code Online (Sandbox Code Playgroud)

要么

    typings install dt~jquery --global --save
Run Code Online (Sandbox Code Playgroud)

利用:

    import { Component, AfterViewInit } from '@angular/core';
    import * as $ from 'jquery';

    ngAfterViewInit() {
        this.doJqueryLoad();     
        this.doClassicLoad();

        $(this.el.nativeElement)
            .chosen()
            .on('change', (e, args) => {
                this.selectedValue = args.selected;
            });
    }

    doClassicLoad() {
      // A $( document ).ready() block.
      $( document ).ready(function() {
          console.log( "Unnecessary..." );
      });      
    }

    // You don't need to use document.ready... 
    doJqueryLoad() {
        console.log("Can use jquery without doing document.ready")
        var testDivCount = $('#testDiv').length;
        console.log("TestDivCount: ", testDivCount);
    }
Run Code Online (Sandbox Code Playgroud)

以下是一个例子的插图:http://plnkr.co/edit/KweZYO9hk9Dz8pqDK77F?p = info


小智 16

我找到的最有效的方法是在页面/组件构造函数中使用时间为0的setTimeout.这让我们在Angular完成加载所有子组件之后的下一个执行周期中运行jQuery.

export class HomePage {
    constructor() {
        setTimeout(() => {
            // run jQuery stuff here
        }, 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

将setTimeout放在ngOnInit方法中也对我有用.

export class HomePage {
    ngOnInit() {
        setTimeout(() => {
            // run jQuery stuff here
        }, 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这适合我,但感觉非常hacky!是否有"适当"方式的更新? (7认同)

Gün*_*uer 4

关于什么

bootstrap(...).then(x => {
  ...
})
Run Code Online (Sandbox Code Playgroud)

否则我会假设ngAfterViewInit()你的根组件是一个符合你的要求的生命周期钩子,但你说你已经测试了所有......

更新

bootstrap()或者ngAfterViewInit()在根组件上只能用于初始加载。对于后来添加的组件,ngAfterViewInit()可以使用添加的组件的。

  • 对我也不起作用。既不是 bootstrap(...).then() 想法,也不是根组件的 ngAfterViewInit() 钩子。对我有用的是在每个路由的每个叶组件的 ngAfterViewInit 中添加 jquery 插件初始化。 (3认同)