为什么GTM在dataLayer中连接对象值?

时间:2015-11-26 15:53:53

标签: google-tag-manager

我有以下代码:

  dataLayer.push({event: 'A',eventAttributes: { attrA: 'a' }});
  dataLayer.push({event: 'B',eventAttributes: { attrB: 'b' }});
  dataLayer.push({event: 'C',eventAttributes: { attrC: 'c' }});

和一个完全空的GTM容器(没有标签,没有触发器,没有变量)。

当我检查GTM调试的Data Layer选项卡时,我看到了:

{
  gtm: {start: 1448552543040, uniqueEventId: 1448552543091},
  event: 'A',
  eventAttributes: {attrA: 'a'}
}

{
  gtm: {start: 1448552543040, uniqueEventId: 1448552543092},
  event: 'B',
  eventAttributes: {attrA: 'a', attrB: 'b'}
}

{
  gtm: {start: 1448552543040, uniqueEventId: 1448552543092},
  event: 'C',
  eventAttributes: {attrA: 'a', attrB: 'b', attrC: 'C'}
}

正如您所看到的,GTM会将值附加到eventAttributes对象而不是替换它。

Q1:为什么GTM会这样做?

Q2:有没有办法可以防止这种情况发生(除了将每个对象属性定义为单独的变量)?

仅供参考我在数据层中使用eventAttributes对象,因为我想简单地重复使用其中的任何内容作为基于事件的工具的属性(Mixpanel,KISSmetrics ......) 。针对上述问题,如果我必须在DataLayer和GTM中明确声明所有变量,我只是没有看到任何方法来扩展Mixpanel / KISSmetrics的GTM实现。

更新

在控制台本身查看dataLayer后,似乎正确推送了值并且没有连接:

enter image description here

因此,在阅读dataLayer时,GTM决定合并它们一定是必须的!

1 个答案:

答案 0 :(得分:0)

回答Q1:

GTM正在这样做,因为这是DataLayer的行为: https://github.com/google/data-layer-helper

enter image description here

回答Q2:

As provided by Brian Kuhm himself (the man behind GTM:) ),如果你想阻止递归合并,你需要先发送一个空值,然后推送你的实际对象。我创建了一个包装器来做到这一点:

window.dataLayer = window.dataLayer || [];
window.dataTrack = function(obj) {
  dataLayer.push({event: 'resetting_objects',eventProperties:null});
  dataLayer.push(obj);
}