Javascript AngularJS-如何在JSON返回后更新$scope上的变量
我是angular的新手,我正在从事一个依赖于服务和工厂的项目。我的问题是,当我使用静态jason数组进行响应时,变量被正确填充并显示在视图中,但当我将其更改为ajax请求并从json文件获取时,响应成功,但控制器变量没有成功加载数据 这是我的角度项目结构: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
'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等)
您可以在不创建承诺的情况下获得相同的结果