Javascript 用于在登录后隐藏元素的重新计算指令
大家好 在这种情况下,我希望根据会话是否处于活动状态来显示一些UI元素 我采取的方法是使用指令。但是,当用户成功登录时,指令不会被计算出来 以前我是这样使用的:Javascript 用于在登录后隐藏元素的重新计算指令,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,大家好 在这种情况下,我希望根据会话是否处于活动状态来显示一些UI元素 我采取的方法是使用指令。但是,当用户成功登录时,指令不会被计算出来 以前我是这样使用的: <ul class="nav navbar-nav navbar-right" ng-hide="vm.model.currentUser.id !== 0"> 为了更好地重构,我将检查逻辑移到了指令级,并将其称为: <ul class="nav navbar-nav navbar-right" !ap-va
<ul class="nav navbar-nav navbar-right" ng-hide="vm.model.currentUser.id !== 0">
为了更好地重构,我将检查逻辑移到了指令级,并将其称为:
<ul class="nav navbar-nav navbar-right" !ap-valid-login-session>
两个问题:
- 这种方法是正确的还是有其他更好的方法
- 如果这种方法是正确的,那么如何确保重新计算该指令
- 您不能使用
代码>在html中。因此,第二个代码段将不起作用。但是,如果您删除了
并将所有逻辑移到指令中,在该指令中添加和删除元素上的隐藏类,这可能会起作用
然而,我使用的编码风格试图避免在指令内部操纵html属性和css类。这是将表示层与业务逻辑层混合在一起,而且关注点分离不好
取而代之的是,我将使用第一个代码片段进行一点小改动。我会将角度表达式提取到如下方法调用中:
<ul class="nav navbar-nav navbar-right" ng-hide="isValidUser()">
这里的好处是:
更具语义意义的html
与表示分离的业务逻辑
更容易为用户编写单元测试
我同意……第一种方法更正确,但在某种方法上更好。!是我代码片段中的拼写错误。当整个页面由ng编译时,它只工作一次。因此,我的问题仍然是,一旦我登录,如何再次计算指令。不管怎样,我认为指令是用来操作html的,所以如果我可以分开,那么肯定是A+。现在当你在指令中说。。。您是否使用指令的范围,如果是这样,那么ng hide属于angular,那么为什么我必须定义指令。如果你接着谈论控制器作用域,那么如果我想为不同的控制器定义isValidUser,我会感到惊讶。是的,我的意思是函数需要在元素的作用域中。在这种情况下,它将是一个控制器。如果
isValidUser
足够复杂,并且跨多个作用域共享,那么您将希望将其提取到自己的服务中。每个使用它的控制器将使用DI注入它,然后将函数添加到其作用域中。
scope.isValidUser = function() { return vm.model.currentUser.id !== 0; }