Adobe 匿名函数运行时更新DTM预定义数据元素的问题

Adobe 匿名函数运行时更新DTM预定义数据元素的问题,adobe,adobe-analytics,Adobe,Adobe Analytics,如果我有一个名为“CS测试”的预定义数据元素: 我想根据基于事件的规则,用新值(例如“更新值”)更新“CS测试”数据元素的值。我不能让它工作?我从上一篇文章中了解到,当您显式调用_satellite.getVar('Example')时,操作顺序是: 查找类型的指定目标(例如,类型js对象的路径(jsvar))并返回该值 查找卫星cookie并返回该值 返回默认值 既然数据元素代码总是被执行并返回一个值,那么不确定如何避免这种情况 我上面的观点是,更新卫星cookie是有效的,但只有在我调用最后

如果我有一个名为“CS测试”的预定义数据元素:

我想根据基于事件的规则,用新值(例如“更新值”)更新“CS测试”数据元素的值。我不能让它工作?我从上一篇文章中了解到,当您显式调用_satellite.getVar('Example')时,操作顺序是:

  • 查找类型的指定目标(例如,类型js对象的路径(jsvar))并返回该值
  • 查找卫星cookie并返回该值
  • 返回默认值
  • 既然数据元素代码总是被执行并返回一个值,那么不确定如何避免这种情况


    我上面的观点是,更新卫星cookie是有效的,但只有在我调用最后一个_satellite.getVar(“CS Test”)时才会起作用,因为它用数据元素代码的值覆盖卫星cookie,并返回数据元素的值

    好的,我将在这里提出一些不同的想法,因为您还不清楚数据元素函数的真正作用,您试图实现的总体目标,等等。。因此,也许其中的一些内容既可以澄清DTM是如何工作的,也可以帮助您达到需要的位置

    直接设置数据元素的cookie仅在DTM内部引用数据元素时“起作用”,例如(如上所述)后续页面加载。此外,我认为(但尚未测试)在规则字段中使用
    %data\u element%
    语法时,它会起作用

    但是,(与我在OP comment中发布的链接相同),当您显式调用
    \u satellite.getVar()
    时,它会强制对您的数据元素规则进行评估。这意味着您在其中的代码(您的匿名函数)将被执行,并执行它所执行的任何操作

    听起来,您可能希望DTM以某种方式执行它,但有选择地忽略其中一些。嗯,DTM不可能做到这一点。如果您希望这样的事情发生,那么必须重写匿名函数以适应这样的操作。但我马上就要回到这个话题了,因为首先我想退一步问一下

    为什么在编写cookie之后还要使用
    \u satellite.getVar()
    ?直接写入cookie的要点是绕过数据元素。更重要的是,你已经有了这个值,因为你只是用它来设置cookie

    因此,可能您只是为了示例而合并了代码,随后的
    .getVar()
    调用位于单独的代码框中,或者超出了设置cookie的范围

    如前所述,当您显式调用
    .getVar()
    时,DTM返回值的操作顺序是

  • 评估数据元素。这意味着您的匿名函数将 执行。如果这返回一个真实的值,那就是你得到的。如果是 不返回真实值

  • 如果它是一个持久数据元素,DTM将查找
    \u sdsat\u[data]
    元素名称]
    cookie。如果它存在(并且有真实的价值),那就是 你得到了什么。如果没有,那么

  • 返回在数据中指定为默认值的值 元素配置(如果未指定任何内容,则未定义)

  • 同样,我在这里有点茫然,因为我不知道您的数据元素的细节和它的最终目标,但在我看来,您似乎希望能够调用
    .getVar()
    ,但操作顺序与DTM在页面加载时的操作顺序类似(1和2是相反的)。嗯,DTM没有一种内置的方法来实现这一点。如果Adobe在数据元素配置中添加选项来指定操作顺序,那就太好了,因为很明显,它的行为不同,这取决于数据元素的引用方式(无论是DTM本身还是您)。但他们现在没有

    因此,如果这是您想要的,那么您需要重新构造匿名函数,使其行为更像DTM在持久数据层中的行为。基本上,向其中添加代码以查找cookie的默认值
    rvalue
    ,然后返回到您现在拥有的值。这将允许您显式调用
    .getVar()
    ,因为现在您的匿名函数(首先执行)将首先查找cookie值

    另一种选择可能是。。假设所有这些代码(即,麻烦的后续
    .getVar()
    调用)都在同一个规则内,但无论出于何种原因,都超出了首先设置cookie的范围(例如,在单独的代码框中),您可以将该值设置为另一个即时创建的数据元素,然后引用该数据元素。这样做而不只是读取cookie的好处是,它将cookie公开给一个数据元素,这样,如果需要,您也可以使用
    %data\u element%
    语法(从设置它的位置开始,向前移动)

    更新:

    _satellite.getVar('data_element')(); // initial page load, returns "default[..]"
    _satellite.getVar('data_element')('foo'); // returns 'foo'
    _satellite.getVar('data_element')(); // returns 'foo'
    _satellite.getVar('data_element')('bar'); // returns 'bar'
    _satellite.getVar('data_element')(); // returns 'bar'
    
    _satellite.getVar('data_element')(); // initial page load, returns "default[..]"
    _satellite.getVar('data_element')('foo'); // still on same page, returns 'foo'
    _satellite.getVar('data_element')(); // still on same page, returns 'foo'
    // reload page or go to new page:
    _satellite.getVar('data_element')(); // new page: returns 'foo'
    _satellite.getVar('data_element')('bar'); // returns 'bar'
    // reload page or go to new page:
    _satellite.getVar('data_element')(); // new page: returns 'bar'
    
    好的,从下面的评论来看,我在玩DTM,看起来你可以做以下事情,这可能就是你想要的

    页面范围的持久性

    例如,在预定义的数据元素中,可以有如下内容:

    return function(rvalue) { 
      _satellite.data.customVars._defaultRvalue = 
        rvalue
        ||
        _satellite.data.customVars._defaultRvalue
        ||
        "default custom script value from some data layer"
      ;
      return _satellite.data.customVars._defaultRvalue;
    }
    
    然后,要获取当前值,您需要执行以下操作:

    _satellite.getVar('data_element')();
    
    将返回当前值,如果没有,则返回“default[…]”

    然后,如果要设置新值,可以执行以下操作:

    _satellite.getVar('data_element')('new value');
    
    这将返回“新值”,如果您进行后续调用(页面范围):

    它将继续返回“新值”

    示例场景:

    _satellite.getVar('data_element')(); // initial page load, returns "default[..]"
    _satellite.getVar('data_element')('foo'); // returns 'foo'
    _satellite.getVar('data_element')(); // returns 'foo'
    _satellite.getVar('data_element')('bar'); // returns 'bar'
    _satellite.getVar('data_element')(); // returns 'bar'
    
    _satellite.getVar('data_element')(); // initial page load, returns "default[..]"
    _satellite.getVar('data_element')('foo'); // still on same page, returns 'foo'
    _satellite.getVar('data_element')(); // still on same page, returns 'foo'
    // reload page or go to new page:
    _satellite.getVar('data_element')(); // new page: returns 'foo'
    _satellite.getVar('data_element')('bar'); // returns 'bar'
    // reload page or go to new page:
    _satellite.getVar('data_element')(); // new page: returns 'bar'
    
    注意:这仅适用于页面持续时间。如果您需要它在一页到另一页之间持久化,则需要设置并从cookie中提取。不要使用
    \u sdsat\u[data\u element]
    cookie,因为
    _satellite.getVar('data_element')(); // initial page load, returns "default[..]"
    _satellite.getVar('data_element')('foo'); // still on same page, returns 'foo'
    _satellite.getVar('data_element')(); // still on same page, returns 'foo'
    // reload page or go to new page:
    _satellite.getVar('data_element')(); // new page: returns 'foo'
    _satellite.getVar('data_element')('bar'); // returns 'bar'
    // reload page or go to new page:
    _satellite.getVar('data_element')(); // new page: returns 'bar'