2016-04-05 50 views
0
angular.module('App').factory('API', ['someAPI', function(someAPI){ 
    var service = {}; 
    service.loadInfo= loadInfo; 
    return service; 
    function loadInfo(id) { 
     var list = []; 
     var items= []; 
     someAPI.list.get({id: id}).$promise.then(function (result) { 
     items= result; 
     if (items.length === 0) { 
      items= 'No results'; 
     } else { 
      for (var i=0; i<items.length; i++) { 
      list.push(items[i].name); 
      } 
     } 
     console.log('List:' + list); **//This print out 'List: a, b, c, d' in console** 
     }) 
     console.log('List:' + list); **//This print out nothing** 
     return list; 
    } 
    } 
]); 

//Controller 
angular.module('App').controller('ProductCtrl', function($scope, API) { 
    $scope.loadInfo = function (id) { 
     $scope.list = API.loadInfo(id); 
     console.log($scope.list); // This print out undefined 
    } 
} 

这可能是一个愚蠢的问题,在我的服务中,可以访问'someAPI'函数中的变量,但控制器会得到一个未定义的值。感谢任何机构能解释我。谢谢!Angularjs返回值给控制器

+0

是不是'API.loadInfo(id)'而不是'someAPI.loadInfo(id)'? – Lex

+0

我的服务中使用了另一个API,名称是一些API。 – James

+0

你可以添加任何小提琴/ Plnkr? –

回答

0

@James在您的控制器中,您需要将$ scope传递给您的函数(这称为依赖注入),这简单地说就是将对象传递给函数。希望能帮助到你!

+0

啊,忘记了,注入被添加了,所以控制器是这样的:angular.module('App')。controller('ProductCtrl',function(API){$ scope.loadInfo = function(id){ $ scope .list = someAPI.loadInfo(id); console.log($ scope.list); // This print out undefined }} – James

0

该列表在someAPI.list.get({id:id})。。$ promise被解析之前立即返回。你需要以承诺的方式去做。另一个问题是您的本地变量名为列表,但您返回列表

我建议,在你的服务,只是做

return someAPI.list.get({id: id}).$promise.then(function (result) { 
    items= result; 
    if (items.length === 0) { 
     items= 'No results'; 
    } else { 
     for (var i=0; i<items.length; i++) { 
     list.push(items[i].name); 
     } 
    } 
    return list; 
    }) 
} 

,并把部分。然后移动到你的控制器。

$scope.loadInfo = function (id) { 
    someAPI.loadInfo(id).then(function (result) { 
    $scope.list = result; 
    }); 
} 
+0

非常感谢,这部分代码在控制器中工作,但现在我想移动这些服务和分享给其他控制器,所以所有的逻辑应该保持服务。 – James

+0

我已经更新了答案,希望这对你有效。 – sdfacre

+0

对不起,这是我的错,应该是“列表”,但你能看到在这个返回之前的console.log,它打印出空的东西。 – James

0

修改了依赖关系并重写了工厂调用。

//Controller 
    angular.module('App').controller('ProductCtrl', function(API,$scope) { 
     $scope.loadInfo = function (id) { 

     API.loadInfo(id) 
       .success(function (data, status, headers, config) { 
        $scope.list = data; 
        console.log($scope.list); 

       }).error(function (e, status, headers, config) { 
        //log error here 
       }); 
    } 
0

尝试此操作会在ajax完成其过程时更新您的操作。

$scope.$watch('list',function(val){ 
     console.log(val); 
}); 
相关问题