我是Java语言的新手,正在尝试使用Angular UI路由,这是我的代码
myApp.config(['$stateProvider', '$urlRouterProvider',function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('home', {
url: '/test',
templateUrl: '/custom.html'
})
.state('detail', {
url: '/{examID}',
views: {
'': {
templateUrl: '/templates/customize.html',
controller: ['$scope', '$stateParams', 'utils',
function ( $scope,$stateParams,utils) {
$scope.exam = utils.findById($stateParams.examID);
console.log('exam is ' + $scope.exam );
}
]
}
}
} )
}])
这是具有findbyID功能的服务
angular.module('service', [])
.factory('utils', function ( $http) {
return {
findById: function findById(id) {
$http.get('/api/exams/' + id).success(function(response) {
return response;
})}
};});
我已经关注了这个话题,但是$ scope.exam仍未定义
How to return value from an asynchronous callback function?
PS。我试图打印出响应,这是一个对象
谢谢
最佳答案
这是很多不熟悉JavaScript的开发人员绊脚石的地方。
这里发生的是您正在将utils.findById()
的返回值分配给$scope.exam
。问题是utils.findById()
实际上不返回任何内容。 (当函数在JavaScript中没有显式的return
语句时,返回值隐式为undefined
。)
您的服务应如下所示:
angular
.module('service', [])
.factory('utils', function ($http) {
return {
findById: function (id) {
return $http.get('/api/exams/' + id);
}
};
});
您可能已经注意到对
.success()
的调用也消失了!不用担心它刚刚移动。与其在
.success()
上调用$http.get()
,不如在utils.findById()
上调用它。这样做将使您可以访问控制器中的response
变量。因为您可以访问response
变量,所以可以将response
分配给$scope.exam
,如下所示:.state('detail', {
url: '/{examID}',
views: {
'': {
templateUrl: '/templates/customize.html',
controller: ['$scope', '$stateParams', 'utils',
function ($scope, $stateParams, utils) {
utils.findById($stateParams.examID)
.success(function (response) {
$scope.exam = response;
});
}
]
}
}
});
希望这一点可以解决。如果我不清楚,请告诉我,以便我更新此答案。