每当路线更改时,AngularJS都会运行一条指令

时间:2018-06-24 06:04:00

标签: javascript angularjs angularjs-directive

指令:

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>

当加载包含该指令的DOM或<div>时,该指令仅运行Javascript代码。效果很好,但是我需要该指令基本上在每次路线更改时刷新或重新运行。本质上,它基于您在if / else语句中看到的路由来显示/隐藏元素。

当前有效,但是您必须手动刷新页面以重新运行该指令,并获取要显示的元素(如果您位于应显示该页面的页面上)。

TLDR:每当路由更改时,我都需要此指令重新运行。

1 个答案:

答案 0 :(得分:0)

每次更改路线时,您都可以在route.js文件中执行此操作,以调用函数chatAssistant()。 通过使用resolve,您可以检查用户是否已通过身份验证。

这是简单的演示。:-

route.js

App.config(function($stateProvider, $urlRouterProvider, $locationProvider) {
  $urlRouterProvider.otherwise('default');
  $stateProvider.
    .state('userDashboard', {
    url: '/userDashboard',
    title: 'User Dashboard',
    templateUrl: 'userDashboard.html',
    resolve: {
      chatAssistant: chatAssistant
    },
    controller: 'userDashboardController'
  })
});

App.config外的最后一个位置之后添加功能以调用每个路线更改

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);
    },
  };
}