【发布时间】:2013-08-25 00:01:23
【问题描述】:
我正在尝试发出一个 $http 请求以获取我的一个 JSON 文件并在我的所有控制器中使用数据。
我在 egghead.io 上看到了如何在多个控制器之间共享数据,并且我还阅读了这个 StackOverflow 问题:“Sharing a variable between controllers in angular.js”。
但是,那里的答案不使用$http 模块。使用$http 时,控制器没有可处理的数据,等到收到响应时已经为时已晚。
然后我在 StackOverflow 上找到了方法 $q.defer 和这个问题:“AngularJS share asynchronous service data between controllers”
那里发布的解决方案运行良好,但有两个问题:
- 每个控制器都会触发
$http请求来获取已经在另一个控制器中使用的相同数据;并且, - 如果我尝试操纵收到的数据,我有一个
then函数。
下面你可以看到我的代码:
controllers.js
'use strict';
/* Controllers */
function appInstallerListCtrl($scope, Data) {
$scope.apps = Data;
}
function appInstallerDetailCtrl($scope, $routeParams, Data) {
$scope.appId = $routeParams.appId;
$scope.apps = Data;
console.log($scope.apps); // <-- then function
console.log(Data); // <-- then function with $vv data returned but I can't access it
for (var i in $scope.apps) // <--- no way, baby!
console.log(i);
}
app.js
var app = angular.module('appInstaller', []);
app.factory('Data', function($http, $q) {
var defer = $q.defer();
$http.get('apps.json').then(function(result) {
defer.resolve(result.data.versions.version);
});
return defer.promise;
});
app.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/app', {templateUrl: 'partials/app-list.html', controller: appInstallerListCtrl}).
when('/app/:appId', {templateUrl: 'partials/app-detail.html', controller: appInstallerDetailCtrl}).
otherwise({redirectTo: '/app'});
}]);
我想要的是,在启动应用程序时,将执行 $http 请求,并且响应将在整个应用程序的所有控制器中使用。
谢谢
【问题讨论】:
标签: angularjs angularjs-scope angularjs-service