javascript - Angular 2 : call a function defined globally in header only works on page load? 不是每次都是?

标签 javascript html angular dom

我的公司要求我将跟踪数据发送到 <head> 中定义的全局函数。这样分析团队就可以进行研究。他们不了解 Angular 2、框架等,并希望它与文档中的完全一样:没有异常(exception)

<head>
...
  <script type="text/javascript">

    function sendAnalytics(data) {
      console.log("GTM data sent" + data);

    };
    var gaData = [_dl];
</script>
</head>

因此,在我的 Angular 服务中,我像这样调用全局定义的函数

window['sendAnalytics'](GTMData_Object);

这适用于页面加载,但当我进入各种路线时,全局定义的函数不再运行?

我尝试过这样的 NG 区域,但仍然没有成功。

 this.zone.runOutsideAngular(() =>  window['sendAnalytics'](GTMData_Object);)

我知道有更好的方法来处理 Angular 2 中的 Google 标签管理器,但显然,我不允许这样做(我尝试过!)。

编辑: 该网站使用路由来跟踪我们想要跟踪的每个使用交互。我总是看到数据传入console.log(),因此它会传递到服务良好。初始页面加载后,我停止在全局函数中获取日志。

服务方法示例

 search_result_clicks(
        search_term: string,
    ): void {
        let trackObject = {
            'site_events': {
                'search_click': search_term
            };       
         console.log(trackObject);
        //push to GTM via global function defined in header
            try { window['sendAnalytics'](trackObject); } 
catch (err) {
 this.handleError(err); 
}
        }

编辑:如果我将脚本标签和函数放在 <app-root> 中然后 Angular 就可以作为全局元素定期访问它。对头部或 body 不起作用。它仍然在index.html 上,这似乎是我们所能得到的最接近的结果。

编辑2:如果放在下面<app-root>,也可以在正文中使用

所以对于处于这种情况的其他人......

header 中的全局函数 + Angular 2 = bad ;必须放在app-root下面或中

头中字符串、数组、对象的全局变量 + Angular 2 = OK;到目前为止,据我所知,GTM 运行良好。

在应用程序根目录下或页面底部的索引 html 中定义的全局函数和变量 = 好的。

最佳答案

您可以将外部函数作为提供者提供给 Angular,并在整个应用程序中共享。当你调用它时,它会调用全局函数。

您可以查看this answer这与您的问题类似。

window.sharedService = new SharedService();

@NgModule({
  providers: [{provide: SharedService, useValue: window.sharedService}],
  ...
})
class AppModule1 {}

@NgModule({
  providers: [{provide: SharedService, useValue: window.sharedService}],
  ...
})
class AppModule2 {}


class MyComponent {
  constructor(private zone:NgZone, private sharedService:SharedService) {
    sharedService.someObservable.subscribe(data => this.zone.run(() => {
      // event handler code here
    }));
  }
}

希望对你有帮助

关于javascript - Angular 2 : call a function defined globally in header only works on page load? 不是每次都是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46308184/

相关文章:

javascript - Canvas 动画/reactjs/with requestAnimationFrame

javascript - 在鼠标单击时选择一个与另一个透明 div 重叠的元素

javascript - jQuery Opera 焦点事件不起作用

html - 如何从 Selenium 中的网页访问对象

asp.net - 多个网页的单个 javascript 函数

javascript - 将 div 追加到特定 div 的父级之上,并在 dom 中更改顺序

javascript - 客户端 PNG 压缩使用像 pngcrush 这样的 javascript?

Angular2 Http POST header 参数类型错误

css - Angular Material 页面不随内容滚动?

javascript - 类型 'value' 上不存在属性 'HTMLElement'