2015-11-03 53 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> 
相關問題