如何从指令访问工厂?

时间:2015-04-05 03:39:31

标签: angularjs angularjs-directive angularjs-ng-show

我有一些导航栏项只有在用户通过身份验证时才会显示。以下简化视图:

导航条

<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()
    }
]);

假设isSecretAgent工厂中设置的bgData值可能会因用户操作而发生变化,如何根据此设置我的ng-show进行更新?

2 个答案:

答案 0 :(得分:2)

你可以用这种方式......

NAVBAR

<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中。

答案 1 :(得分:1)

如果您使用函数调用编写ng-show:

<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
    }
]);

不是分配给函数调用,而是分配函数(最后删除&#39;()&#39;