2015-11-03 62 views
0

我的应用程序中有一个标题,它使用一个指令来显示/隐藏链接,具体取决于用户权限,该指令使用一个服务,该服务返回带有布尔结果的已解析承诺。问题是标题导航链接没有正确显示/隐藏(它显示了以前的用户可访问的链接,所以我假设该服务没有被调用),当我用chrome控制台调试时,我期望显示一些日志在服务或指令,但没有什么,我看到日志的唯一方法是通过重新加载页面。当页面变化时,AngularJs指令没有被正确调用

指令:

.directive('hasAccess', ['PermissionsService', function(PermissionsService) { 
return { 
    restrict: 'A', 
    scope: { 
    requiredAccess: "@", 
    requiredAccessFunc: '@' 
    }, 
    link: function(scope, element, attrs) { 
    PermissionsService[scope.requiredAccessFunc](scope.requiredAccess, scope.locationId).then(function(bool) { 
     console.log("hasAccess"); 
     if (!bool) { 
     element.addClass('hidden'); 
     } 
    }, function(error) { 
     element.addClass('hidden'); 
    }); 
    } 
}; 
}]) 

服务:

smps.checkSettingsAccess = function(settingName) { 
    console.log("checkSettingsAccess"); 
    var deferred = $q.defer(); 
    UserFactory.get().$promise.then (function(response) { 
    deferred.resolve(response[settingName]); 
    }, function() { 
    deferred.reject(response); 
    }); 
    return deferred.promise; 
} 

部首指令:

.directive('header', function() { 
return { 
    restrict: 'A', 
    replace: true, 
    templateUrl: "directives/header.html", 
    controller: ['$scope', '$filter', function ($scope, $filter) { 

    }] 
} 

})

部首HTML:

<li><a has-access required-access="company_access" required-access-func="checkSettingsAccess" ng-href="#/company_info">Company</a></li> 
<li><a has-access required-access="locations_access" required-access-func="checkSettingsAccess" ng-href="#/locations">Locations</a></li> 
<li><a has-access required-access="staff_members_access" required-access-func="checkSettingsAccess" ng-href="#/staff_members">Staff</a></li> 
<li><a has-access required-access="customers_access" required-access-func="checkSettingsAccess" ng-href="#/customers">Customers</a></li> 
<li><a has-access required-access="online_scheduling_access" required-access-func="checkSettingsAccess">Online Scheduling</a></li> 

回答

0

你的指令手表在父域内的两个变量: scope: { requiredAccess: "@", requiredAccessFunc: '@' }

如果你想渲染指令,你应该改变这个变量。因为你的指令取决于内部状态。

+0

这些变量是服务使用的字符串,requiredAccessFunc是服务函数,requiredAccess是函数的参数。我认为问题仍然存在于页面更改时不会调用的指令上。如何在不更改我有两个范围变量的情况下更改它? – user1262904

+0

所以我认为你可以使用$ render。这里https://docs.angularjs.org/api/ng/type/ngModel.NgModelController – Errorpro

+0

当我移动标题(html)的内容并将其放在一个视图上时,它只是起作用,而我甚至没有重新加载页面,所以我认为问题也可能与呈现标题html的标题指令相关,请记住标题是通过dom属性调用指令的标题。 – user1262904

0

为什么smps.checkSettingsAccess通过deferred.resolve();deferred.reject();.then(function(bool)需要一个布尔值,你确定这是正确的吗?在then函数中,bool的值是多少?它可能是一个对象,因此总是如此?

我建议,而不是仅仅这样做:
element.addClass('hidden');
你这样做: element.removeClass('hidden');
,并有所有的HTML默认的东西class='hidden'因为它是一个安全的事情,应该默认为隐藏,而AJAX发生。

+0

smps.checkSettingsAccess函数正在操作promise,所以我在做的是返回一个布尔值true或false。 then(function(bool)是调用服务函数的结果,它可能是真或假。我认为你不理解这个问题。我的问题是我的指令根本没有被执行,只是当我重新加载该页面手动。 – user1262904

0

我迄今所做的是:

  1. 取出hasAccess指令
  2. 的currentUser添加到像rootScope:$ rootScope.currentUser
  3. 使用currentUser问如果给定的访问真的(显示)或者它的假(隐藏)

我知道...它不是最好的解决方案,因为它有点难看,但至少它工作。

我需要了解的是如何创建一个依赖于注入服务的头指令(该服务通过rootScope使用ng-resource),该指令应该能够在rootScope.currentUser更改时重新加载或追赶它正确显示HTML中的链接。

随时提出改进或任何意见。谢谢!

<li><a ng-show="currentUser['company_access']" ng-href="#/company_info">Company</a></li> 
    <li><a ng-show="currentUser['locations_access']" ng-href="#/locations">Locations</a></li> 
    <li><a ng-show="currentUser['staff_members_access']" ng-href="#/staff_members">Staff</a></li> 
    <li><a ng-show="currentUser['customers_access']" ng-href="#/customers">Customers</a></li> 
    <li><a ng-show="currentUser['online_scheduling_access']">Online Scheduling</a></li> 
相关问题