自定义模板 callInWindow

Custom templates callInWindow

我正在使用新的自定义模板功能,但我对一般概念还是很陌生,我正在寻找对以下代码的意见,我想从 GTM 调用我的应用程序上的全局函数,将此代码适用于我的自定义标签吗?

const log = require('logToConsole'); // Console api
const query = require('queryPermission'); // Query api
const callInWindow = require('callInWindow'); // Call function in window api

if (query('access_globals', 'execute', 'OBJ.tracking.add')) { // Trying to access the method
    log('data =', data); // USE ONLY IN DEBUG
    callInWindow( 'OBJ.tracking.add' , [data.tagLabel, data.tagDetail]); // Send event
    data.gtmOnSuccess();
}
else {
  data.gtmOnFailure();
} 

其中 OBJ.tracking.add 只有 execute 权限。 谢谢!

我刚刚经历过这个。您的语法是正确的,但这并不能保证这实际上 运行 - 这取决于 "OBJ" 实际在做什么。如果它在某个时候修改原型链,代码将不会 运行(原因之一是 GTM 自定义模板实际上 运行 在全局对象的副本上,而不是对象本身)。

因此,虽然您的代码很好,但由于 sandboxed Javascript 的限制,它可能不会 运行,在这种情况下您无能为力。

Elke 的回答是正确的,因为 copyFromWindow api 对对象进行了深度复制。 callInWindow api 将调用 window 上的实际对象,并将其余参数传递给它。在您的情况下,您可能希望调用 callInWindow 将标签作为第二个参数传递,将详细信息作为第三个参数传递,除非 Obj.tracking.add 需要数组作为参数。