【问题标题】:Adobe DTM not recognizing angular variable as data elementAdobe DTM 未将角度变量识别为数据元素
【发布时间】:2014-04-17 23:12:07
【问题描述】:

我正在 Adob​​e DTM 管理面板中定义数据元素,按照以下说明:

http://microsite.omniture.com/t2/help/en_US/dtm/index.html#Data_Elements

我已经成功测试了相当标准的 JS 变量,例如 document.URL;这会正确填充到 prop 和/或 eVar 中。

我们的框架是有角度的;我们创建了一个名为“analytics”的 Angular 工厂,它保存了我们的分析包需要访问的值。

我还通过 chrome 开发者工具对工厂进行了测试,以确保它在控制台中返回正确的值,并且确实返回了正确的值。

访问这些值的示例行如下:

angular.element('*[ng-app]').injector().get('analytics').sVar.profileId

这会在控制台中返回正确的值,例如:"1234-5678-9101"

当我尝试在 Adob​​e DTM 中使用此路径时,不会在分配给此值的 prop 和/或 eVar 中填充任何值。

我想知道 Adob​​e Analytics 是否在解释此路径时遇到问题,或者我是否使用了不正确的路径。我接触 AngularJS 是初学者。

谢谢。

【问题讨论】:

    标签: javascript angularjs adobe-analytics


    【解决方案1】:

    那不是真正的路径.. 那是一组链接在一起的 js 表达式,所以我不确定 DTM 是否真的可以处理它。

    您是否尝试过将其作为自定义脚本来实现?如果你这样做,它肯定会起作用。

    如果它仍然不起作用,那么听起来你也有时间问题。向下滚动到该页面上的“数据元素可用性”部分。

    但即便如此,这可能还不够。例如如果您在设置为触发“顶部”的规则中使用它,则可能在您的数据甚至存在之前出现。所以你可能也需要改变它。

    编辑更多关于时间的信息

    DTM 目前不提供一种方法来控制何时通过界面设置数据元素(例如,基于事件的规则中的下拉菜单)。但是,它确实提供了一种在一般情况下显式设置它的方法。

    简而言之,您可以调用它来显式评估数据元素

    _satellite.getVar('data element name');

    您将其放置在何处取决于您需要它何时/何​​地可用。因此,基本上您将在 DTM 确实 允许时序控制的上下文中调用它。

    例如,正如我之前提到的,向下滚动到“Data Element Availability”部分,详细了解如何将数据元素显式设置为规则条件的一部分。例如,页面加载规则可以设置为在 DOM 就绪或 Onload (window.load) 时弹出。

    这可能对你不起作用,例如如果在 dom 就绪或 window.load 之后发生角度服务层调用(我不知道您的脚本实际上在做什么)。

    如果是这种情况,另一种方法是将 DTM 底部页面代码放在回调中,以便当您的数据可从 Angular 的服务层调用中获得时,并且(如果还没有)更改您的 adobe 分析调用以触发在“页面底部”。

    或者,您可以让最初的 Adob​​e Analytics 页面视图按照自己的节奏进行,并调用 DTM 直接调用规则,让您的变量作为第二次 Adob​​e Analytics 调用弹出。基本上工作的方式是你制定一个直接调用规则,对于条件字符串,你会有一些独特的东西,比如“foobar”,然后在规则中设置你的 Adob​​e vars。然后在数据层值可用时弹出的任何角度回调中,您将调用

    _satellite.track('foobar')

    编辑#2

    所以我在 DTM 核心代码中四处寻找,在我看来 pageBottomFired 在 dom 准备就绪时也设置为 true。因此,基本上将_satellite.pageBottom() 包装在某些东西中对您不起作用(上面的删除线)。 IMO 我不认为它应该是这样,但我想它就是这样。

    我确信直接调用方法会起作用,因为我以前使用过这种方法。但我同意,这不是一个理想的解决方案。要从中删除额外的 ping,您可以做的一件事是从主工具列表中删除 Adob​​e Analytics,而是在直接调用规则中将其作为自定义 js 输出 - 这基本上意味着数据元素现在毫无意义,因为您可以直接弹出s.prop 或 w/e 连同您的 Adob​​e Analytics 代码直接在其中。简而言之,这是一个非常丑陋的解决方案,它违背了 DTM 的观点,但除非 Adob​​e 将其更改为仅在显式调用时触发 pageBottom(),否则它要么是这样,要么与双重 Adob​​e Analytics 请求一起生活:/

    我想另一种选择可能是将实际的 DTM 脚本包含到您的 angular.js 回调中,但是 a)这也会破坏具有完整时序范围的 DTM 的值,b)我不知道 DTM 将如何实际反应那。我可能会玩弄它,看看它是否“有效”,但没有承诺。

    【讨论】:

    • 感谢蜡笔的回答。我已经转而使用 jquery 表达式,它似乎作为自定义脚本工作,除了一个问题。由于 angular 的性质,在调用我们的服务层时,DTM 完成加载的速度比 angular 快得多,导致 props 被填充为占位符值,因为实际值还没有时间注入。我知道您可以将点击链接等操作最多延迟 100 毫秒,但是有没有一种方法可以让 DTM 延迟很长时间?
    • Angular 很有趣。我认为我们现在非常确定 Angular 仍在发出请求,或者至少在 DOM Ready 和 Onload 发生后完成它们。 Angular 有一个控制器$http.pendingRequests,我们将尝试的下一个解决方案是在没有更多请求发生时调用_satellite.pagebottom()。不确定这是否可行,但它是我目前所拥有的最好的。
    • 我们正在测试上述解决方案,但页面返回错误_satellite.pagebottom is not a function - 在我们的新函数有机会之前,_satellite.papageBottomFired 是否有可能被设置为 true检查待处理的请求?
    • @jmorrison 可能是一个愚蠢的问题,但您使用的是_satellite.pageBottom()(驼峰式)而不是_satellite.pagebottom(),您只是在这里打错了吗?
    • 这是我的错字,抱歉。继续测试直接调用并取得了一些成功。很难为每个页面复制一个解决方案。
    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多