我是否可以仅在使用Angular2 Universal的客户端中运行组件方法?

Edg*_*nez 10 javascript d3.js angular2-universal angular

我正在写一个angular2通用应用程序.它有一个d3图表,但我希望只在客户端(浏览器)呈现d3图表而不是尝试在服务器上呈现它.angular2 universal中是否有一个接口只能在客户端运行组件方法?

class ComponentWithChart implements OnInit, ngUniversalBrowser {

  elem;

  constructor( private viewContainerRef:ViewContainerRef) {}

  ngUniversalBrowserOnInit() {

    this.elem = this.viewContainerRef.element.nativeElement;

    d3.select(this.elem).append('div').style({
      'background-color':'yellow'
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

是否有类似上面的示例可能只允许我ngUniversalBrowser在浏览器中运行该方法OnInit

hex*_*hex 5

import { isBrowser } from 'angular2-universal';
Run Code Online (Sandbox Code Playgroud)

isBrowser 是一个布尔值,您可以将其导入到您的组件中,然后仅当它在客户端上运行时才可以有条件地执行代码。

if (isBrowser) {
     // this will not run on server
}
Run Code Online (Sandbox Code Playgroud)


Ral*_*h N 1

我想我得到了答案。但这完全是一种黑客行为,我确信他们无意让你这样做。

我自己也遇到了死胡同(这迫使我关闭角度通用/预渲染)。我的损失也许就是你的收获。

有些特定对象在预渲染时不可用。主要是“窗口”,即“document.window”。

为什么不尝试在组件中添加条件语句来检查对象是否存在。如果没有,请加载黄色背景。否则,正常加载。

我不确定这是否意味着当“真正的”客户端完成加载时您的组件将无法刷新。但我确信您可以设置一些东西来监视“窗口”并使其发生。

ngInit() {  
    if (!window) {
      // yellow background placeholder
    } else
      // real plumbing
    }
}
Run Code Online (Sandbox Code Playgroud)