2015-04-05 61 views
0

我有一些導航欄項目只有在用戶通過驗證時纔會顯示。簡化視圖下方:如何從指令訪問工廠?

導航條

<body ng-controller="mainController as main">... 
    <li ng-show="main.isSecretAgent"><a href="#secret">THIS IS A SECRET</a></li> 
</body> 

FACTORY

tardis.factory('bgData', [function() { 
    var persistentData = { 
     isSecretAgent: false, 
    }; 
    return { 
     checkIfSecretAgent: function(){ 
      return persistentData.isSecretAgent 
     } 
    } 
}]); 

主控制器

tardis.controller('mainController',["$scope","bgData", 
    function($scope,bgData) { 
     $scope.isSecretAgent = bgData.checkIfSecretAgent() 
    } 
]); 

假設bgData工廠的isSecretAgent值可能會根據用戶操作而更改,那麼如何根據此設置我的ng-show進行更新?

回答

1

如果你寫使用函數調用你的NG-顯示:

<span ng-show="isSecretAgent()">Show me when I'm a secret agent</span> 

然後每一個消化的時間運行在工廠內的值將被檢查。這就是你應該做的所有事情。

除非你需要改變你isSecretAgent調用的函數如下:

tardis.controller('mainController',["$scope","bgData", 
    function($scope,bgData) { 
     $scope.isSecretAgent = bgData.checkIfSecretAgent 
    } 
]); 

而不是分配給函數調用,分配的功能(刪除「()」在年底

2

你可以有一個函數這樣...

導航條

<body ng-controller="mainController as main">... 
    <li ng-show="main.isSecretAgent()"><a href="#secret">THIS IS A SECRET</a></li> 
</body> 

主控制器

tardis.controller('mainController',["$scope","bgData", 
    function($scope,bgData) { 
     $scope.isSecretAgent = function { 
      return bgData.checkIfSecretAgent() 
     } 
    } 
]); 

此外,如果你使用ng-if,因爲它會更好案件ng-show該元素仍然是公關在DOM中不存在。

+0

是,但有時ng-if由於DOM操作而改變緩慢,並且這可能很難看。 – 2015-04-05 03:49:16

+0

將'ng-show'改爲函數並等待像@PeterAshwell這樣的摘要表明和maandoo的解決方案「更好練習「? – Huey 2015-04-05 03:50:50

+0

@PeterAshwell是的,可能存在ng的問題 - 如果你喜歡你所說的和某些範圍的pr因爲它創建了自己的範圍,但在身份驗證的情況下,使用ng會更好 - 如果正確? – Srinath 2015-04-05 03:51:37