Javascript AngularJS-如何在JSON返回后更新$scope上的变量

Javascript AngularJS-如何在JSON返回后更新$scope上的变量,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,我是angular的新手,我正在从事一个依赖于服务和工厂的项目。我的问题是,当我使用静态jason数组进行响应时,变量被正确填充并显示在视图中,但当我将其更改为ajax请求并从json文件获取时,响应成功,但控制器变量没有成功加载数据 这是我的角度项目结构: 'use strict'; angular .module('mytestapp',['ngRoute']) .config(config) .controller('HomeCtrl', HomeCtrl) .contro

我是angular的新手,我正在从事一个依赖于服务和工厂的项目。我的问题是,当我使用静态jason数组进行响应时,变量被正确填充并显示在视图中,但当我将其更改为ajax请求并从json文件获取时,响应成功,但控制器变量没有成功加载数据

这是我的角度项目结构:

'use strict';
angular
  .module('mytestapp',['ngRoute'])
  .config(config)
  .controller('HomeCtrl', HomeCtrl)
  .controller('AboutCtrl', AboutCtrl)
  .factory('GeneralInit', GeneralInit)
  .service('UserSrv', UserSrv);
  GeneralInit.$inject = ['UserSrv','$q'];
  HomeCtrl.$inject = ['GeneralInit','$timeout','UserSrv'];
这是我的配置:

    function config($routeProvider) {
      $routeProvider
        .when('/', {
            templateUrl: 'template/home.html',
            controller: 'HomeCtrl',
            controllerAs: 'hmc',
            resolve: {
              GeneralInit: function(GeneralInit){
                return GeneralInit();
              }}
        })
        .when('/about', {
          templateUrl: 'template/about.html',
          controller: 'AboutCtrl',
          controllerAs: 'abc',
          resolve: {
            GeneralInit: function(GeneralInit){
              return GeneralInit();
            }}
        });
    }
这是我的服务:

function UserSrv($http) {
  var User={};
  var service = {
    getUser: Get,
    updateUser: Update,
    logoutUser: Logout
  };
  return service;

  function Get() {
    //return {"FirstName":"StaticName","LastName":'StaticLastName'}
    $http.get('/user.json')
      .success(function(data, status, headers, config) {
          User = data;
          console.log(User);
          return User;
      })
      .error(function(data, status, headers, config) {

      })
  }

  function Update() {

  }

  function Logout() {

  }

}
我的控制器和初始化项:

function GeneralInit(UserSrv,$q)
{
  return function() {
    var User = UserSrv.getUser(); //{'FirstName':'FstName','LastName':'LstName'};//
    var Base='browser';

    return $q.all([User, Base]).then(function(results){
      return {
        User: results[0],
        Base: results[1]
      };
    });
  }
}

function HomeCtrl(GeneralInit,$timeout)
{
  var hmc= this;
  $timeout(function(){
      hmc.User=GeneralInit.User;
      console.log(hmc.User);
    }
  ,0);
}

您的GeneralInit函数期望getUser返回承诺,因此只需将其更改为:

function UserSrv($http, $q) {
  var User={};
  var service = {
    getUser: Get,
    updateUser: Update,
    logoutUser: Logout
  };
  return service;

  function Get() {
    var deferred = $q.defer();
    //return {"FirstName":"StaticName","LastName":'StaticLastName'}
    $http.get('/user.json')
      .success(function(data, status, headers, config) {
          User = data;
          console.log(User);
          deferred.resolve(user);
          return User;
      })
      .error(function(data, status, headers, config) {

      });
      return deferred.promise;
  }
}

console.log(hmc.User)中看不到任何数据的原因语句是因为在执行此语句时,承诺尚未实际解析(获取用户的请求尚未返回)。尽管由于使用了
$timeout
调用了摘要循环,
hmc.User
还没有数据

在请求实际返回到
GeneralInit
方法后,尝试调用摘要循环,您应该可以获得数据

此外,您可能还应该更改Get方法以返回承诺:

function UserSrv($http) {
  var User = {};

  var service = {
    getUser: Get
  };

  return service;

  function Get() {
    return $http.get('/user.json')
      .success(function(data, status, headers, config) {
        User = data;
        console.log(User);
        return User;
      })
      .error(function(data, status, headers, config) {

      })
  }
}

如何使用promise-resolved-then函数捕获“用户”和“基础”变量。您必须在内部运行回调,然后回调以更新控制器。未测试,但我认为如果
返回$http.get(etc等)
您可以在不创建承诺的情况下获得相同的结果