仅使用一次调用,在所有控制器上使用来自角度服务资源的返回数据

时间:2014-06-30 15:59:56

标签: angularjs angularjs-service

我有一个用.NET编写的自定义Web API,它返回将在我的AngularJS应用程序中使用的用户信息。我希望能够调用我的API一次,然后在整个AngularJS应用程序中使用返回的JSON,而不必在每个控制器中调用API。

我目前有一个服务工厂,其中一个返回我需要在其余服务中使用的所有客户的详细信息。

.factory('customApiService', function ($resource) {
    return {
        userInfo: function(userId, callback){
            var api = $resource('../../api/UserInfo/:userId', {
                userId: userId
            }, {
                fetch: 'JSONP',
                'query': { isArray: false }
            });

            api.fetch(function (response) {
                callback(response);
            });
        }
    }
)

现在我不想在每个控制器中调用此userInfo服务,但我确实希望将数据传递到每个控制器而不多次调用我的API。

customApiService.userInfo(userId, function (d) {
    var gaProfileId = d.gaProfileId;
    var yelpId = d.yelpId;
    var tripAdvisorId = d.tripAdvisorId;
    var facebookPageName = d.facebookPage;
    var twitterHandle = d.twitterHandle;
    var clientName = d.clientName;
    var searchlightAccountId = d.searchlightAccountId;
    var searchlightDomain = d.searchlightDomainId;
 }

2 个答案:

答案 0 :(得分:0)

您可以尝试全局变量。

使用$ rootScope https://docs.angularjs.org/guide/scope $ rootScope在所有控制器中都有一个模板。只需在你的控制器或任何需要的地方注入$ rootscope。

答案 1 :(得分:0)

从我读到的您的描述和对其他问题的回答中,听起来您正试图在应用程序的其余部分启动之前进行异步调用。这是可能的,但是很复杂,并且首先使Angular无效。在我看来,你有两个选择:

  1. QUICK HACK :如果你真的想要这种行为,为什么要开始你的应用呢?在您首先定义应用程序之前,请先处理您的请求,然后在请求的结果处理程序中定义您的应用程序。

  2. 正确的方式:改变服务和控制器的行为,以容忍没有足够的信息来完全启动。很多时候这比听起来要困难。通常,您可以将promise链接到其初始化代码块中,以等待所需的数据。看看Brian Ford的“Angular Modal”项目,按照我在这里强调的代码行:

    https://github.com/btford/angular-modal/blob/master/modal.js#L25-L36

    此技术设置了从函数返回的承诺。如果它所需的数据已经从服务加载,它会立即解析承诺。否则,它会调用以获取它之后的内容,稍后您可以看到(第39行)模块使用promise.then()等待它有需要运行的数据。

    使用异步数据时,这是控制器和服务的理想模式。

  3. 如果使用$ resource调用,请注意大多数$ resource调用在名为$ promise的属性中返回一个promise。你可以这样做:

    var MyController = function($scope) {
        // This will get set soon!
        $scope.myData = null;
    
    
        var myResource = $resource('/path/to/:someId', { someId: '@id' });
        myResource.get({ someId: 1 }).$promise.then(function(data) {
               $scope.myData = data;
        });
    };
    

    您可以在承诺的.then()解析回调中执行更多操作,例如初始化控制器的更多部分等。还有一些方法可以延迟启动整个控制器,直到资源可用。一个非常酷的方法是,如果您碰巧使用Angular ui-router模块,则在定义每个路由时都有一个“resolve”选项。您可以使用它来调用$ resource,如上所示,ui-router将等待启动您的控制器/视图,直到它满足它所需的为止。