如何在应用程序中使用之前从工厂服务加载数据

时间:2016-06-08 17:11:28

标签: angularjs asp.net-mvc angular-services

这是一个使用AngularJS的ASP.NET MVC应用程序。

当应用程序加载时,我们必须调用一些action方法,它返回一个资源字典,字符串键字符串值。

这个资源数组/字典需要在整个应用程序中可用。

在应用程序中访问这些资源之前,我们如何等待这些资源加载?

var app = angular.module("app", []);

app.controller("TestCtrl", ['cacheService', function (cacheService) {
    var self = this;
    self.test = function () {
        var value = cacheService.getResourceValue('Err_lbl_UserExist');
    }
}]);

app.factory('cacheService', ['$http', function ($http) {
    var obj = {};
    obj.resourceDictionary = [];

    obj.loadResourceDictionary = function () {
        var httpConfig = {
            url: "/Cache/GetResourceDictionary",
            method: "GET",
            headers: {
                "X-Requested-With": 'XMLHttpRequest',
                "__RequestVerificationToken": $("[name=__RequestVerificationToken]").val()
            }
        }
        $http(httpConfig)
            .success(function (data) {
                obj.resourceDictionary = data;
            });
    }

    obj.getResourceValue = function (resourceKeyName) {
        if (obj.resourceDictionary.length <= 0) {
            obj.loadResourceDictionary();
        }

        return obj.resourceDictionary[resourceKeyName];
    }
    return obj;
}]);

编辑/接受的答案

var app = angular.module("app", []);

app.controller("TestCtrl", ['cacheService', function (cacheService) {
    var self = this;
    self.test = function () {
        var value = cacheService.getResourceValue('Err_lbl_UserExist');
    }
}]);

app.factory('cacheService', ['$rootScope', '$http', function ($rootScope, $http, $q) {
    var obj = { resourcesLoaded: false };

    obj.loadResourceDictionary = function () {
        obj.resourcesLoaded = false;

        var httpConfig = {
            url: "Cache/GetResourceDictionary",
            method: "GET",
            headers: {
                "X-Requested-With": 'XMLHttpRequest',
                "__RequestVerificationToken": $("[name=__RequestVerificationToken]").val()
            }
        }

        $http(httpConfig).success(function (data) {
            obj.resourceDictionary = data;
            obj.resourcesLoaded = true;
            $rootScope.$broadcast("ResourcesLoaded", null);
        });
    }

    obj.getResourceValue = function (resourceKeyName) {
        if (!obj.resourcesLoaded) {
            obj.loadResourceDictionary();
            $rootScope.$on("ResourcesLoaded", function () {
                return obj.resourceDictionary[resourceKeyName];
            });
        } else {
            return obj.resourceDictionary[resourceKeyName];
        }
    }

    return obj;
}]);

1 个答案:

答案 0 :(得分:1)

您可以在上使用广播

因此,一旦加载了密钥,您就可以使用广播

来激活事件

https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope#$广播

在任何需要使用 on 的地方收听该消息:

https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope#$上

您可以将数据存储在服务中,这将使其成为单身,您可以重复使用它,您所要做的就是将服务注入您需要的任何控制器中。