{"_id":"57d698404340330e00953c77","project":"564f643f33082f0d001bb714","user":"564f641651f2ec0d001d6998","version":{"_id":"57d698404340330e00953c6c","project":"564f643f33082f0d001bb714","__v":2,"createdAt":"2016-09-12T11:57:52.437Z","releaseDate":"2016-09-12T11:57:52.437Z","categories":["57d698404340330e00953c6d","57d698404340330e00953c6e","57d698404340330e00953c6f","57d698404340330e00953c70","57d698404340330e00953c71","57d698404340330e00953c72","57d698404340330e00953c73","58a5711c79ac232f00cbadb5"],"is_deprecated":false,"is_hidden":false,"is_beta":false,"is_stable":true,"codename":"","version_clean":"1.1.0","version":"1.1"},"category":{"_id":"57d698404340330e00953c70","version":"57d698404340330e00953c6c","__v":0,"project":"564f643f33082f0d001bb714","sync":{"url":"","isSync":false},"reference":false,"createdAt":"2016-09-02T11:53:18.476Z","from_sync":false,"order":3,"slug":"digital-data-manager","title":"Digital Data Manager"},"parentDoc":null,"__v":1,"updates":[],"next":{"pages":[],"description":""},"createdAt":"2016-09-07T09:15:09.917Z","link_external":false,"link_url":"","githubsync":"","sync_unique":"","hidden":false,"api":{"results":{"codes":[]},"settings":"","auth":"required","params":[],"url":""},"isReference":false,"order":2,"body":"[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Подписка на изменение переменной DigitalData\"\n}\n[/block]\nПомимо [подписки на события](https://digitaldata.readme.io/docs/работа-с-событиями) , вы также можете подписываться на изменения внутри объекта window.digitalData и выполнять код, если определенная переменная была изменена.\n\nНапример, если вы хотите выполнять определенное действие при добавлении товара в корзину, можно подписаться на изменение длины переменной cart.lineItems.\n\nПример приведен ниже:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"// Проверка существования ddListener массива\\nwindow.ddListener = window.ddListener || [];\\n\\n// Подписка на любые изменения внутри DDL:\\nwindow.ddListener.push(['on', 'change', function(newDigitalData, oldDigitalData){\\n  // данная функция будет вызвана, если какое-либо поле\\n  // в объекте window.digitalData будет изменено\\n}]);\\n\\n// Подписка на изменение определенного поля внутри DDL:\\nwindow.ddListener.push(['on', 'change:keyString', function(newKeyValue, oldKeyValue) {\\n  // где \\\"keyString\\\" - это поле объекта window.digitalData, например:\\n  // \\\"change:transaction\\\" сработает если объект transaction изменится\\n  // \\\"change:basket.line_items.length\\\" сработает если товар будет \\n  // добавлен или удален из корзины\\n}]);\\n\\n  \",\n      \"language\": \"javascript\"\n    }\n  ]\n}\n[/block]\nDDL Listener будет доступен автоматически в случае использования последней версии [Digital Data Manager](https://github.com/driveback/digital-data-manager) на вашем сайте.\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Подписка на инициализацию переменной DigitalData\"\n}\n[/block]\nПомимо подписки на изменения (смотрите выше), вы также можете подписываться на инициализацию любой переменной внутри объекта window.digitalData.\n[block:callout]\n{\n  \"type\": \"success\",\n  \"body\": \"Под \\\"инициализаицей\\\" мы понимаем присваивание переменной любого значения, отличного от **null** или **undefined**.\",\n  \"title\": \"Пояснение\"\n}\n[/block]\nНапример, вы хотите выполнить определенное действие, как только определенная переменная DDL будет определена.\n\nПример приведен ниже:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"// Проверка существования ddListener массива\\nwindow.ddListener = window.ddListener || [];\\n\\n// Подписка на инициализацию определенного поля внутри DDL:\\nwindow.ddListener.push(['on', 'define:keyString', function(value) {\\n  // где \\\"keyString\\\" - это поле объекта window.digitalData, например:\\n  // \\\"change:user.userRFM\\\" сработает если поле userRFM получит\\n  // значение отличное от undefined или null\\n}]);\\n\",\n      \"language\": \"javascript\"\n    }\n  ]\n}\n[/block]\nДанная возможность необходима потому, что в силу асинхронности JavaScript, код обращения к переменной может быть вызван до того, как переменная инициализаирована.\n\n## Пример 1\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"window.digitalData = {\\n\\t'user': {\\n  \\t'userId': '123'\\n  },\\n  'website': {...},\\n  'page': {...}\\n  ...\\n};\\n\\nsetTimeout(function() {\\n  // асинхронно получаем данные об RFM-сегменте из CRM спустя 1 секунду\\n  var user = window.digitalData.user.userRfm = 'VIP';\\n}, 1000);\\n\\nif (window.digitalDatauser.userRfm) {\\n\\tconsole.log('RFM-сегмент пользователя:', window.digitalDatauser.userRfm);\\n} else {\\n\\tconsole.log('RFM-сегменте пользователя не задан');\\n}\\n\\n\",\n      \"language\": \"javascript\"\n    }\n  ]\n}\n[/block]\nРезультат:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"# RFM-сегменте пользователя не задан\",\n      \"language\": \"text\"\n    }\n  ]\n}\n[/block]\n## Пример 2\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"window.digitalData = {\\n\\t'user': {\\n  \\t'userId': '123'\\n  },\\n  'website': {...},\\n  'page': {...}\\n  ...\\n};\\n\\nsetTimeout(function() {\\n  // асинхронно получаем данные об RFM-сегменте из CRM спустя 1 секунду\\n  var user = window.digitalData.user.userRfm = 'VIP';\\n}, 1000);\\n\\nddListener.push(['on', 'define:user.userRFM', function(userRFM) {\\n  if (userRFM) {\\n    console.log('RFM-сегмент пользователя:', userRFM);\\n  } else {\\n    console.log('RFM-сегменте пользователя не задан');\\n  }\\n}]);\",\n      \"language\": \"javascript\"\n    }\n  ]\n}\n[/block]\nРезультат:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"# RFM-сегмент пользователя: VIP\",\n      \"language\": \"text\"\n    }\n  ]\n}\n[/block]","excerpt":"","slug":"работа-с-изменениями-ddl","type":"basic","title":"Реагирование на изменения DigitalData"}

Реагирование на изменения DigitalData


[block:api-header] { "type": "basic", "title": "Подписка на изменение переменной DigitalData" } [/block] Помимо [подписки на события](https://digitaldata.readme.io/docs/работа-с-событиями) , вы также можете подписываться на изменения внутри объекта window.digitalData и выполнять код, если определенная переменная была изменена. Например, если вы хотите выполнять определенное действие при добавлении товара в корзину, можно подписаться на изменение длины переменной cart.lineItems. Пример приведен ниже: [block:code] { "codes": [ { "code": "// Проверка существования ddListener массива\nwindow.ddListener = window.ddListener || [];\n\n// Подписка на любые изменения внутри DDL:\nwindow.ddListener.push(['on', 'change', function(newDigitalData, oldDigitalData){\n // данная функция будет вызвана, если какое-либо поле\n // в объекте window.digitalData будет изменено\n}]);\n\n// Подписка на изменение определенного поля внутри DDL:\nwindow.ddListener.push(['on', 'change:keyString', function(newKeyValue, oldKeyValue) {\n // где \"keyString\" - это поле объекта window.digitalData, например:\n // \"change:transaction\" сработает если объект transaction изменится\n // \"change:basket.line_items.length\" сработает если товар будет \n // добавлен или удален из корзины\n}]);\n\n ", "language": "javascript" } ] } [/block] DDL Listener будет доступен автоматически в случае использования последней версии [Digital Data Manager](https://github.com/driveback/digital-data-manager) на вашем сайте. [block:api-header] { "type": "basic", "title": "Подписка на инициализацию переменной DigitalData" } [/block] Помимо подписки на изменения (смотрите выше), вы также можете подписываться на инициализацию любой переменной внутри объекта window.digitalData. [block:callout] { "type": "success", "body": "Под \"инициализаицей\" мы понимаем присваивание переменной любого значения, отличного от **null** или **undefined**.", "title": "Пояснение" } [/block] Например, вы хотите выполнить определенное действие, как только определенная переменная DDL будет определена. Пример приведен ниже: [block:code] { "codes": [ { "code": "// Проверка существования ddListener массива\nwindow.ddListener = window.ddListener || [];\n\n// Подписка на инициализацию определенного поля внутри DDL:\nwindow.ddListener.push(['on', 'define:keyString', function(value) {\n // где \"keyString\" - это поле объекта window.digitalData, например:\n // \"change:user.userRFM\" сработает если поле userRFM получит\n // значение отличное от undefined или null\n}]);\n", "language": "javascript" } ] } [/block] Данная возможность необходима потому, что в силу асинхронности JavaScript, код обращения к переменной может быть вызван до того, как переменная инициализаирована. ## Пример 1 [block:code] { "codes": [ { "code": "window.digitalData = {\n\t'user': {\n \t'userId': '123'\n },\n 'website': {...},\n 'page': {...}\n ...\n};\n\nsetTimeout(function() {\n // асинхронно получаем данные об RFM-сегменте из CRM спустя 1 секунду\n var user = window.digitalData.user.userRfm = 'VIP';\n}, 1000);\n\nif (window.digitalDatauser.userRfm) {\n\tconsole.log('RFM-сегмент пользователя:', window.digitalDatauser.userRfm);\n} else {\n\tconsole.log('RFM-сегменте пользователя не задан');\n}\n\n", "language": "javascript" } ] } [/block] Результат: [block:code] { "codes": [ { "code": "# RFM-сегменте пользователя не задан", "language": "text" } ] } [/block] ## Пример 2 [block:code] { "codes": [ { "code": "window.digitalData = {\n\t'user': {\n \t'userId': '123'\n },\n 'website': {...},\n 'page': {...}\n ...\n};\n\nsetTimeout(function() {\n // асинхронно получаем данные об RFM-сегменте из CRM спустя 1 секунду\n var user = window.digitalData.user.userRfm = 'VIP';\n}, 1000);\n\nddListener.push(['on', 'define:user.userRFM', function(userRFM) {\n if (userRFM) {\n console.log('RFM-сегмент пользователя:', userRFM);\n } else {\n console.log('RFM-сегменте пользователя не задан');\n }\n}]);", "language": "javascript" } ] } [/block] Результат: [block:code] { "codes": [ { "code": "# RFM-сегмент пользователя: VIP", "language": "text" } ] } [/block]