0

Я использую переменную в слое данных GTM, которая извлекает ее значение из вызова API Liferay rest API.Переменная Javascript undefined при использовании в слое данных в GTM

var openId; 
AUI().ready('aui-base', function(A){ 
Liferay.Service(
     '/user/get-user-by-id', 
     { 
     userId: Liferay.ThemeDisplay.getUserId() 
     }, 
     function(obj) { 
      openId=obj.openId; 
     } 
       ); 
    }); 

Здесь переменная openId используется в GTM dataLayer, где он не доступен и показывает, как undefined. слой данных определяется, как показано ниже:

dataLayer = [{ 
       "page" : Liferay.currentURL 
       ,"pageType" : instrDetail 
       ,"user" : { 
          "type" : userType 
          ,"accountId" : openId 
          } 
      }]; 

и в конце концов, у нас есть блок GTM, определяющий блок тегов менеджер сценария.

(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 
})(window,document,'script','dataLayer','GTM-XXXXXX'); 

Теперь, когда я пытаюсь получить доступ к openId переменной в dataLayer, он показывает, как определено, в то время как при попытке получить доступ к одной консоли один браузер, он отображает правильное значение.

ответ

0

Это было решено после попытки дважды.

Во-первых, после некоторого поиска я столкнулся с этим фактом, что это была асинхронная проблема Javascript. DataLayer извлекал переменную до получения ответа Rest call, и, следовательно, переменная была недоступна в dataLayer (извлекается до времени) и был доступен на странице посте that.In для того, чтобы разобраться в этом вверх, dataLayer должны были быть построены, после успешного приема response.Hence, callback функции назывались, содержащей dataLayer, после успешного получения ответа

AUI().ready('aui-base', function(A){ 
Liferay.Service(
     '/user/get-user-by-id', 
     { 
     userId: Liferay.ThemeDisplay.getUserId() 
     }, 
     function(obj) { 
      callback(obj.openId); 
     } 
       ); 
    }); 

Но затем возникла еще одна проблема, теперь блок сценариев GTM выполнялся при загрузке страницы, прежде чем отдыхать API, поэтому все остальные переменные стали undefined. Это было связано с тем, что теперь datalayer недоступен для GTM-скрипта, прежде чем отвечать на вызов REST.

Чтобы отсортировать это, блок сценария dataLayer и GTM должен был быть частью функции callBack и вызван после того, как ответ успешно получен. Это, наконец, решило проблему.

function callback(openId) 
    { 
     dataLayer = [{ 
       "page" : Liferay.currentURL 
       ,"pageType" : instrDetail 
       ,"user" : { 
          "type" : userType 
          ,"accountId" : openId 
          } 
        }]; 
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 
})(window,document,'script','dataLayer','GTM-PGLDG7W'); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^