如何确保我的变量不能直接在角度工厂外使用?

时间:2017-03-29 04:48:09

标签: javascript angularjs ajax

我有一个角度工厂,其中包括管理对象列表的方法。其中一种方法有助于进行ajax调用并将更多项加载到列表中。当调用该方法时,我需要显示ajax调用的“进行中”状态(即加载项目)。现在,我可以使用像service.isLoading = ...这样的简单变量,并根据状态将其设置为truefalse。但是,问题是外部和使用此工厂的任何控制器都可以看到此变量。

angular.module('myApp')
    .factory('appFactory', function QuestionsServ(...) {

        var service = {
            list: []
        };


        // loading state to help show if system is busy loading ajax data
        service.isBusy = false;


        service.loadItems = function () {
            service.isBusy = true;

            // make ajax call here
            var request = ...

            return request.then( function(res) {
                 // after successful loading show state is not busy
                 service.isBusy = false;
                 ...
            }

        ...

但我希望能够在工厂内保持此变量可见。因此,我可以将isBusy更改为类似于以下内容的内容。

        service.isBusy = function () {
            return false;
        }

但现在它显然也很忙于工厂。我无法再从isBusy内访问loadItems。解决这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以将isBusy设为var本地模块,并直接在代码中对其进行操作。然后,要将它暴露给外部世界,创建一个返回它的函数 - 这样,其他模块或构造可以访问布尔值以进行显示,但不能在服务中操纵它的值:

angular.module('myApp')
    .factory('appFactory', function QuestionsServ(...) {

        var service = {
            list: []
        };


        // loading state to help show if system is busy loading ajax data
        var isBusy = false;

        service.isLoading = function () {
            return isBusy;
        };


        service.loadItems = function () {
            isBusy = true;

            // make ajax call here
            var request = ...

            return request.then( function(res) {
                 // after successful loading show state is not busy
                 isBusy = false;
                 ...
            }