AngularJS запускает директиву каждый раз, когда меняется маршрут - PullRequest
0 голосов
/ 24 июня 2018

Директива:

app.directive('chatAssistant', chatAssistant);

chatAssistant.$inject = ['$rootScope', '$state'];

function chatAssistant($rootScope, $state) {
  return {
    link: function() {
      let listener = function() {
        !(function(g, s, q, r, d) {

          r = g[r] = g[r] || function() {
            (r.q = r.q || []).push(arguments);
          };

          d = s.createElement(q);
          q = s.getElementsByTagName(q)[0];
          d.src = '//placeholder.cloudfront.net/tracker.js';
          q.parentNode.insertBefore(d, q);
        })(window, document, 'script', '_gs');

        _gs('GSN-XXXXXX-N');

        if ($state.current.name === 'login' ||
            $state.current.name === 'register' ||
            $state.current.name === 'forgotPassword' ||
            $state.current.name === 'passwordReset') {
          _gs('set', 'chat', {button: false});
        } else {
          _gs('set', 'chat', {button: true});
        }
      };
      $rootScope.$on('$viewContentLoaded', listener);
    },
  };
}

HTML, где он вставлен:

<div ui-view
     chat-assistant>

Эта директива просто запускает код Javascript, когда загружается DOM или <div>, который содержит директиву.Это прекрасно работает, но мне нужна директива для обновления или повторного запуска при каждом изменении маршрута.По сути, он показывает / скрывает элемент на основе маршрута, который вы можете увидеть в операторе if / else.

В настоящее время он работает, но вы должны вручную обновить страницу для повторного выполнения директивы и получитьэлемент для отображения, если вы находитесь на странице, где он должен быть показан.

TLDR: мне нужна эта директива для повторного запуска при каждом изменении маршрута.

1 Ответ

0 голосов
/ 24 июня 2018

Вы можете сделать это в файле route.js при каждом изменении маршрута, когда вам нужно вызвать функцию chatAssistant().с помощью разрешения вы можете проверить, аутентифицирован ли пользователь или нет.

Вот простая демонстрация.функция для вызова каждого изменения маршрута

var chatAssistant = function($rootScope, $state) {
  return {
    link: function() {
      let listener = function() {
        !(function(g, s, q, r, d) {
          r = g[r] = g[r] || function() {
            (r.q = r.q || []).push(arguments);
          };

          d = s.createElement(q);
          q = s.getElementsByTagName(q)[0];
          d.src = '//placeholder.cloudfront.net/tracker.js';
          q.parentNode.insertBefore(d, q);
        })(window, document, 'script', '_gs');
        _gs('GSN-XXXXXX-N');
        if ($state.current.name === 'login' ||
            $state.current.name === 'register' ||
            $state.current.name === 'forgotPassword' ||
            $state.current.name === 'passwordReset') {
          _gs('set', 'chat', {
            button: false
          });
        } else {
          _gs('set', 'chat', {
            button: true
          });
        }
      };
      $rootScope.$on('$viewContentLoaded', listener);
    },
  };
}
...