【问题标题】:AngularJS GET petition in a FactoryAngularJS GET 在工厂中的请愿书
【发布时间】:2017-05-10 19:40:52
【问题描述】:

我看过几篇关于这个的帖子,但我无法让它们适应我想做的事情。

我有一个 GET 请求到服务器以获取 JSON 响应,并且工作起来就像一个魅力。

.controller('ListController', ['$scope', '$http', function($scope, $http){

    $http.get('js/data.json').success(function(data){
       $scope.elements = data;
    });
}])

现在我可以使用 ng-repeat 在视图中打印 $scope.elements 中的所有元素。

但是现在我需要做两个不同的 GET,取决于是否有互联网,在线检查,如果没有,检查本地数据库。

我创建了一个工厂,如下所示:

.factory('AttemptFactory', function($http){

var self = this;

this.elements = [];

this.returnFunction = function() {

    $http.get('js/data.json').success(function(data){
        self.elements = data;
     });
 }
}   

我首先尝试填充 this.elements,然后在第一个控制器中使用 $scope.newList = = AttemptFactory.elements 访问它。 还尝试了返回self.elements,并用AttemptFactory = AttemptFactory.returnFunction();接收它

我在 .controller() 中添加了 AttemptFactory 的依赖注入。

如何存档??

如果(在线) 数据 = 获取(来自服务器); 别的 数据 = 获取(from_local_DB);

返回数据;

类似的东西。非常感谢。

【问题讨论】:

    标签: angularjs ajax get


    【解决方案1】:

    我认为您可以尝试将您的顾虑分开一点。我建议创建两个工厂:一个与您的服务器交互,一个与本地数据库交互。每个都可以有一个从各自的数据存储中获取数据并为该数据返回 Promise 的方法。

    然后在您的控制器中,您可以根据连接状态选择调用哪个函数。函数调用都将返回一个 Promise,您可以将其 .then 关闭以获取视图数据。例如:

    .factory('ServerFactory', function($http){
    
        var serverFactory = {};
    
        serverFactory.fetchJson = function() {
            // note that we're returning the promise that $http get returns that will resolve with our data
            return $http.get('js/data.json').success(function(res){
               return res.data;
            });
        }
    
        return serverFactory;
    })
    .factory('LocalDbFactory', function() {
        var localDbFactory = {};
    
        localDbFactory.fetchJson = function() {
            // Return promise for JSON data here
        }  
    
        return localDbFactory;
    
    })
    .controller('ListController', ['$scope', '$http', 'ServerFactory', 'LocalDbFactory', function($scope, ServerFactory, LocalDbFactory){
    
        var result;
        if (/* test if online */) {
            result = ServerFactory.fetchJson();
        } else {
            result = LocalDbFactory.fetchJson();
        }
    
        result.then(function(data) {
            $scope.elements = data;
        })
    
    }])   
    

    【讨论】:

    • 太棒了!这就是我想做的。我想从请愿书中返回“数据”,而不是全部承诺。我不知道如何在 .success().error() 函数中“返回”。问题:当你写 data.then() 时,你指的是之前的 var 结果,对吗?为了使用返回的承诺。我将立即测试代码! =) 谢谢!
    • 糟糕。我的意思是result.then()。我们只是链接了来自服务器或本地数据库的数据的承诺。还对 if 语句进行了更正。在 else 块中,LocalDbFactory 应该正在调用。
    • 是的,我收集了!哈哈谢谢你! =D
    • 当我执行以下操作时:result.then(function(data) { $scope.elements = data; console.log($scope.elements; }) 我在这个 console.log 中得到的不是“数据”,而是完整的承诺对象:对象 {数据:数组(30),状态:200 , config: Object, statusText: "OK", headers: function} 我使用 .then(data) 子句来管理异步调用。这是唯一剩下的一点。非常感谢,到目前为止你帮了很多忙!
    • 我回答自己:我收到了一个“数据”变量,其中包含内部数据、状态、配置、状态文本和标题。我只需要做$scope.elements = data.data; 就可以了。这不是一个承诺。 =') 最好的问候!
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多