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