当我调用Details函数时,它给出了空的详细信息,因为Details函数在从json文件获取数据之前正在执行。如何解决问题?
app.controller('loginCtrl',function($scope,login){
$scope.user=login.Details();
}
app.factory('login',function($cookieStore,$http){
var users=[];
$http.get("js/user.json").success(function(data){
angular.copy(data,users);
});
return{
Details:function()
{
alert(users);
return users;
}
}
答案 0 :(得分:1)
您需要在$scope.user
的成功回调中更新$http.get
。最好的方法是在控制器中定义成功函数并将其传递给您的服务。所以你的服务就变成了:
app.factory('login', function($cookieStore,$http){
var userCache;
return {
doLogin: function(user, password, successCallback) {
if(!userCache) {
$http.get("js/user.json").success(function(data) {
userCache = data;
successCallback(data);
});
}
}
}
}
并且您的控制器会在点击处理程序中的某处添加此内容:
login.doLogin('sampleUsername', 'samplePassword', function(data) {
$scope.user = data;
});
这应该完成您需要的大部分工作,您可能需要根据您验证登录的方式以及该示例JSON文件包含的内容进行调整。祝你好运。
答案 1 :(得分:0)
它会给你空用户,因为你已经定义了你的var user = []; 然后和Ajax调用,然后你返回那个用户,所以因为你不是异步地这样做,所有这些都将同步,Javascript很乐意返回一个emtpy用户:!!!
有一些方法可以解决这个问题,使用promise就是其中之一
app.factory('login',function(){
return{
Details:function(){
promise = $http.get("js/user.json");
promise.then(function(data){
return data;
});
}
}
});
或者你可以这样做:
app.factory('login',function(){
return{
Details:function(){
$http.get("js/user.json")
.success(function(data){
return data;
})
}
}
});