2015-12-14 2 views
0

Следующее за this answer, я пытался создать две директивы, чтобы позволить/запрещать элементы, которые должны быть видны конечному пользователю.Директива по скрыть/показать элементы на основе сеанса - AngularJS

angular.module('app.directives').directive('deny', ['SessionTool', function (SessionTool) { 
    return { 
     restrict: 'A', 
     link: function (scope, elem, attrs) { 
      scope.$watch(SessionTool.user, function (value, oldValue) { 
       var list = attrs.deny.split(','); 
       if (SessionTool.hasAnyRole(list)) 
        return elem.hide(); 
       return elem.show(); 
      }); 
     } 
    } 
}]); 

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

Ниже приводится резюме моего SessionTool.

angular.module('app.tools').factory('SessionTool', ['$cookies', function ($cookies) { 
    var _cookieKey = 'user'; 

    return { 
     user: {}, 
     init: function() { 
      var u = $cookies.get(_cookieKey); 
      try { 
       u = angular.fromJson(u); 
       this.user = u; 
      } catch (e) { 
       console.log('invalid json'); 
      } 
     }, 
     login: function (u) { 
      this.user = u; 
      $cookies.putObject(_cookieKey, u, {path: '/'}); // @TODO encrypt the whole JSON before saving it to cookies. 
     }, 
     ... 
    }; 
}]); 

Любой может указать, почему часы $ не уволены?

Заранее спасибо.

+0

Я предполагаю, что ваши часы не увольняются, потому что переменная SessionTool.user не существует в области ваших указателей. –

ответ

0

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

angular.module('app.tools').factory('SessionTool', ['$cookies','$rootScope', function ($cookies) { 
var _cookieKey = 'user'; 
var _user = {}; 

return { 

    setUser: function(user) { 
     _user = user; 
     $rootScope.$broadcast('SessionToolChange'); 
    } 
    getUser: function() { 
     return _user; 
    } 
    init: function() { 
     var u = $cookies.get(_cookieKey); 
     try { 
      u = angular.fromJson(u); 
      this.user = u; 
     } catch (e) { 
      console.log('invalid json'); 
     } 
    }, 
    login: function (u) { 
     this.user = u; 
     $cookies.putObject(_cookieKey, u, {path: '/'}); // @TODO encrypt the whole JSON before saving it to cookies. 
    }, 
    ... 
}; 

}]);

angular.module('app.directives').directive('deny', ['SessionTool', function  (SessionTool) { 
     return { 
      restrict: 'A', 
      controller: function (scope, elem, attrs) { 
       scope.$on('SessionToolChange', function (value, oldValue) { 
        // get the user and do your stuff. 
       }); 
      } 
     } 
    }]); 
+0

Проблема также может заключаться в том, что вы привязываетесь внутри функции связывания, а не в контроллере. Я думаю, что функция связывания выполняется только один раз. Подробнее здесь: http://stackoverflow.com/questions/15676614/angularjs-link-vs-compile-vs-controller –