Javascript中的返回值,但结果是未定义
我是Javascripts新手,我正在尝试使用AngularUI路由,下面是我的代码Javascript中的返回值,但结果是未定义,javascript,angularjs,Javascript,Angularjs,我是Javascripts新手,我正在尝试使用AngularUI路由,下面是我的代码 myApp.config(['$stateProvider', '$urlRouterProvider',function($stateProvider, $urlRouterProvider) { $stateProvider .state('home', { url: '/test', templateUrl: '/cus
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仍然没有定义
另外,我试着打印出响应,它是一个对象
Thx您必须等待ajax调用完成。将控制器中的代码修改为:
$scope.exam;
utils.findById($stateParams.examID).then(function(data) {
$scope.exam = data.data;
}
阅读AngularJS和JavaScript中“承诺”的概念 使用延迟承诺,以便在响应后返回值 服务:
angular.module('service', [])
.factory('utils', function ( $http) {
return {
findById: function findById(id) {
var promise=$http.get('/api/exams/' + id);
return promise;
};});
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) {
utils.findById($stateParams.examID).then(function(value) {
$scope.exam = value;
console.log('exam is ' + $scope.exam );
});
}
]
}
}
})
}])
控制器:
angular.module('service', [])
.factory('utils', function ( $http) {
return {
findById: function findById(id) {
var promise=$http.get('/api/exams/' + id);
return promise;
};});
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) {
utils.findById($stateParams.examID).then(function(value) {
$scope.exam = value;
console.log('exam is ' + $scope.exam );
});
}
]
}
}
})
}])
这是一个让许多新接触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()
的调用也消失了!别担心。它只是移动了一下
我们不想在$http.get()
上调用.success()
,而是想在utils.findById()
上调用它。这样做将使您能够访问控制器中的响应
变量。由于您将有权访问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;
});
}
]
}
}
});
希望这件事能澄清。如果我对任何事情都不清楚,请告诉我,以便我可以更新此答案。耶!:我很高兴能帮上忙。