我有一个用.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;
}
答案 0 :(得分:0)
您可以尝试全局变量。
使用$ rootScope https://docs.angularjs.org/guide/scope $ rootScope在所有控制器中都有一个模板。只需在你的控制器或任何需要的地方注入$ rootscope。
答案 1 :(得分:0)
从我读到的您的描述和对其他问题的回答中,听起来您正试图在应用程序的其余部分启动之前进行异步调用。这是可能的,但是很复杂,并且首先使Angular无效。在我看来,你有两个选择:
QUICK HACK :如果你真的想要这种行为,为什么要开始你的应用呢?在您首先定义应用程序之前,请先处理您的请求,然后在请求的结果处理程序中定义您的应用程序。
正确的方式:改变服务和控制器的行为,以容忍没有足够的信息来完全启动。很多时候这比听起来要困难。通常,您可以将promise链接到其初始化代码块中,以等待所需的数据。看看Brian Ford的“Angular Modal”项目,按照我在这里强调的代码行:
https://github.com/btford/angular-modal/blob/master/modal.js#L25-L36
此技术设置了从函数返回的承诺。如果它所需的数据已经从服务加载,它会立即解析承诺。否则,它会调用以获取它之后的内容,稍后您可以看到(第39行)模块使用promise.then()等待它有需要运行的数据。
使用异步数据时,这是控制器和服务的理想模式。
如果使用$ 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将等待启动您的控制器/视图,直到它满足它所需的为止。