我是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;
            });
        }
      ]
    }
  }
});


希望这一点可以解决。如果我不清楚,请告诉我,以便我更新此答案。

08-15 15:24
查看更多