Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法将$q中的数据获取到范围中_Javascript_Angularjs_Angularjs Scope_Angularjs Service - Fatal编程技术网

Javascript 无法将$q中的数据获取到范围中

Javascript 无法将$q中的数据获取到范围中,javascript,angularjs,angularjs-scope,angularjs-service,Javascript,Angularjs,Angularjs Scope,Angularjs Service,我正在尝试使用$q将一些从API返回的数据绑定到我的作用域中,我能够从服务器中提取数据,没有任何问题(我可以看到使用fiddler返回JSON),但是$scope变量仍然为空,如果有任何帮助,我将不胜感激!提前谢谢 代码: toDoListService.js app.factory("toDoListService", function ($http, $q) { var deferred = $q.defer(); return {

我正在尝试使用$q将一些从API返回的数据绑定到我的作用域中,我能够从服务器中提取数据,没有任何问题(我可以看到使用fiddler返回JSON),但是$scope变量仍然为空,如果有任何帮助,我将不胜感激!提前谢谢

代码:

toDoListService.js

 app.factory("toDoListService", function ($http, $q) {
        var deferred = $q.defer();

        return {
            get: function () {

                $http({ method: 'GET', url: '/api/todo/' }).
                    success(function (data) {
                        deferred.resolve(data);
                    }).
                    error(function (data, status, headers, config) {
                        deferred.reject(status);
                    });
                return deferred.promise;
            }
});
toDoListController.js

app.controller("toDoListController", function($scope, toDoListService){
      $scope.toDoList = toDoListService.get();
});

首先,您应该将
var deferred=$q.deferred()get
函数中使用code>,这样每个
get
都有自己的延迟对象

其次,
get
实际返回的是一个承诺。因此,您需要通过以下方式访问数据:

app.controller("toDoListController", function($scope, toDoListService){
    toDoListService.get().then(function(data){
           $scope.toDoList = data;
    });
});

现在,您的
$scope.toDoList
必须遵守承诺。这种绑定方法过去是有效的,但我认为在1.2中被弃用了

正如Michael所建议的,你必须做到:

app.controller("toDoListController", function($scope, toDoListService){
  toDoListService.get().then(function(data){
    $scope.toDoList = data;
  });
});
此外,这里根本不需要使用
$q
,因为
$http
无论如何都会返回一个承诺。因此,您可以这样做:

app.factory("toDoListService", function ($http){       
   return {
     get: function () {
        return $http({ method: 'GET', url: '/api/todo/' });
     }
   };
});

您可以使用以下方法简化代码:

toDoListService.js

app.factory("toDoListService", function ($http, $q) {
    return {
        get: function () {
            return $http({ method: 'GET', url: '/api/todo/' });
        }
    }
});
app.controller("toDoListController", function($scope, toDoListService) {
    toDoListService.get().then(function(response){
        $scope.toDoList = response.data;
        return response;
    });
});
toDoListController.js

app.factory("toDoListService", function ($http, $q) {
    return {
        get: function () {
            return $http({ method: 'GET', url: '/api/todo/' });
        }
    }
});
app.controller("toDoListController", function($scope, toDoListService) {
    toDoListService.get().then(function(response){
        $scope.toDoList = response.data;
        return response;
    });
});
确保在成功回调中返回
response
,否则链接承诺将不会收到它