2014-01-13 112 views
0

我有一個JSON服務輸出一個roleName和一個id,我試圖使用該角色來隱藏或顯示應用程序中的元素,使用angular指令。看起來該服務已成功調用,並且$ scope.data正在從輸出中填充,但我似乎無法從數據對象訪問該角色,因爲控制檯日誌讀取的值爲$ scope.data.rolename的Undefined 。無法訪問Angular指令中服務的對象屬性

.JS

app.directive('restrictTo', ['SecuritySvc', function (SecuritySvc) { 
return { 
    restrict: 'EA', 
    replace: true, 
    transclude: true, 
    scope: {}, 
    controller: ['$scope', '$attrs', '$q', 'SecuritySvc', function ($scope, $attrs, $q, SecuritySvc) { 
     $scope.data = SecuritySvc.getRole(); 

      if ($scope.data.roleName == $attrs.restrictTo) { 
       $scope.allowed = true; 
      } else { 
       $scope.allowed = false; 
      } 

      console.log($scope.data); // showing in log 
      console.log($scope.data.roleName); // Undefined 

    }], 
    template: '<div ng-show="{{ $scope.allowed }}" ng-transclude></div>' 
} 

從代碼的控制檯輸出上面

$promise: Object 
$resolved: true 
roleId: 1 
roleName: "Admin" 

undefined 

回答

1

我覺得我對你的目的有點困惑在這裏。您正在創建延期承諾,然後立即解決?這是否不符合延遲/承諾模式處理異步調用的目的?您的SecuritySvc.getRole()方法是否會執行AJAX調用來返回該數據?我一直認爲AJAX調用一旦完成就應該調用Promise::resolve。您是否嘗試過使用$http

即使如此,我真的很困惑,你可以console.log data成功,但不是data.roleName。出現的data意味着無論您使用延遲/承諾模式,您都可以在需要的地方獲得迴應。在這一點上你確定data對象的結構嗎? data和您的信息之間沒有圖層?我有點驚訝地看到它被埋在角度方法和屬性像$promise$resolved

不知道是否有任何這是有幫助的...

+0

我清理了,把承諾了,希望這將讓事情清晰一點。 SecuritySvc.getRole();在控制器中工作,我可以顯示data.roleName但不在指令中。 – rlwheeler

+0

@citizenslave我可以看到你已經盡力回答這裏的問題,但在大多數情況下,最好在你回答問題之前給你解釋一下。 –

+1

@TwentyGotoTen,謝謝。一旦我有足夠的聲望,我會盡快做到這一點,但我沒有意識到這是正確的協議。 --- @rlwheeler,這有助於清理你的代碼,但你可以重新運行它,並複製/粘貼控制檯結果更新的代碼?顯然'$ promise'和'$ resolved'屬性應該沒有了。即使marfarma的回答如下,我仍然格外困惑,你如何記錄一個對象而不是其中一個成員。 – citizenslave

0

當你的指令創建一個孤立的範圍(如你的那樣),該服務訪問視圖控制器我已經看到了這種行爲(而不是指令控制器)範圍。由於範圍不同,因此$scope.data對象不同。

您可以通過在指令控制器中放置一個斷點並在服務中放置另一個斷點來檢查範圍ID號,並檢查$ id值。有幾種方法可以解決這個問題,但具體的解決方案將取決於您的具體實施。

這可能有助於在隔離範圍綁定讀了 - 「@」和「=」,請參閱:

http://docs.angularjs.org/guide/directive