2013-12-10 50 views
1

我有下面的Angular文件,我试图用$ http访问数据库,然后在$ scope变量中使用这个数据(显示在网页)。麻烦的是我不能让$ q.defer运行,因为我相信它应该。 $ http函数内的console.log()记录一个包含从数据库返回的数据的对象。但是,当我调用该函数时,它会记录Object {then: function}。数据包含在这个对象中,但它不是对象的唯一部分。 (好像它在对象。$$诉我不知道这意味着什么。)

var app = angular.module("app", []); 

app.factory('portfolioFactory', function ($http, $q) { 
     var obj = {}; 
    obj.getResponse = function(){ 
     var deferred = $q.defer(); 
     $http.get('./../includes/portfolio/db_access.php').success(function(data){ 
       deferred.resolve(data); 
       console.log(data); 
     }); 
     //console.log(deferred.promise); 
     return deferred.promise; 
    } 
    return obj; 
}); 

app.controller("PortfolioCtrl", function($scope, portfolioFactory) { 
    $scope.PortfolioItems = portfolioFactory.getResponse(); 
    console.log($scope.PortfolioItems); 
}); 

回答

3
$http.get(...); 

返回promise

app.controller("PortfolioCtrl", function($scope, portfolioFactory) { 
    portfolioFactory.getResponse().then(function(response) { 
     $scope.PortfolioItems = response.data; 
    }) 
}); 

将工作。

在老版本的Angular中$scope.PortfolioItems = portfolioFactory.getResponse(); 也会有效,但是在更新的版本中,Angular不再自动解开承诺。

承诺基本上是一种处理异步行为的替代和更好的方式(design pattern)。 与其使用常规方式使用回调,您可以使用promise.then(callback)将回调放入队列中。然后,无论何时调用deferred.resolve方法,回调都会与结果一起调用。如果承诺已经在排队的回调之前解决,那么他们立即使用缓存数据进行调用。比做query(callback)的代码好得多,这个代码经常变成callback hell

仅供参考,你可以,而做到这一点,因为任何$http调用的结果已经是一个承诺:

app.factory('portfolioFactory', function ($http) { 
    var obj = {}; 

    obj.getResponse = function(){ 
     return $http.get('./../includes/portfolio/db_access.php').then(function(data){ 
      console.log(data); 
      return data; //Return data further up the chain. 
     }); 
    } 
    return obj; 
}); 
+0

我仍然不能使用'$ scope.PortfolioItems'作为数据绑定变量。我有一个ng重复的变量,虽然它没有加载任何东西。 –

+0

它是否在控制台输出任何东西? –

0

你应该能够调用“那么”功能让您的数据。

app.controller("PortfolioCtrl", function($scope, portfolioFactory) { 
    $scope.PortfolioItems = portfolioFactory.getResponse(); 

    $scope.PortfolioItems.then(function(results){ 
     console.log(results); 
    }; 
}); 

它可能拼出来标注这样的事情....

app.controller("PortfolioCtrl", function($scope, portfolioFactory) { 
    $scope.PortfolioItems = null; 
    var fetchPortfolioItems = portfolioFactory.getResponse(); 

    fetchPortfolioItems.then(function(results){ 
     $scope.PortfolioItems = results; 
     console.log($scope.PortfolioItems); 
    }; 
}); 
相关问题