javascript - 使用工厂 AngularJS 提供处理后的数据

标签 javascript angularjs

我正在开发一个应用程序,我在其中调用网络服务并获得响应。我在 2 个不同的模块中使用该响应。在第一个模块中,我按原样使用,在第二个模块中,我进行了一些格式化并使用它。

我创建了一个获取数据的服务如下

angular.module('myApp').factory('getData',function($http, $q, restURLS) {

var getData= {};

getData.getTree = function () {
    var deferred = $q.defer();
    $http.get(restURLS.getTree).
        success(function (data) {
            deferred.resolve(data);
        }).error(deferred.reject);
        return deferred.promise;
    };
    return getData;
});

为了服务响应,我创建了另一个工厂,如下所示

angular.module('myApp').factory('tree', function($http, $q, restURLS, getData, messages) {

  var tree= {};

  tree.hierarchy = {};
  tree.formattedHierarchy = {};

  function formatHierarchy(data) {
      //some formatting on data.
      tree.formattedHierarchy = data;
  }

  function callTree() {
      getData.getTree()
        .then(function (data) {
            tree.hierarchy = angular.copy(data);
            formatHierarchy(data);
        }).catch(function () {
            //error
        });
  }

  callTree();

   return tree;
});

我只想调用一次网络服务。如果加载了数据,那么 factory('tree') 应该将数据发送到 Controller 。否则 factory('tree') 应该调用 webservice 并加载数据。

最佳答案

你需要一些东西来知道你是否得到了你的树......试试这个:

(更新)

var myApp = angular.module('myApp', ['ngMockE2E'])
// FAKE HTTP CALL JUST FOR EMULATE
    .run(function ($httpBackend) {

    var tree = [{
        node1: 'abcde'
    }, {
        node2: 'fghi'
    }];

    $httpBackend.whenGET('/tree').respond(function (method, url, data) {
        return [200, tree, {}];
    });
})
// YOUR HTTP SERVICE
    .factory('getData', function ($http, $q) {

    return {

        getTree: function () {
            var deferred = $q.defer();
            $http.get("/tree").
            success(function (data) {
                deferred.resolve(data);
            }).error(deferred.reject);
            return deferred.promise;
        }
    }
})
    .factory('TreeFactory', function ($http, $q, getData) {

    var tree = {};
    var updated = false;

    tree.hierarchy = {};
    tree.formattedHierarchy = {};

    function formatHierarchy(data) {
        //some formatting on data.
        tree.formattedHierarchy = data;
    }

    return {
        callTree: function() {
            if(!updated){
                console.log("making http call");
                return getData.getTree().then(function (data) {

                    tree.hierarchy = angular.copy(data);
                    formatHierarchy(data);
                    updated = true;
                    return tree;
                }).
                catch (function () {
                    //error
                });
            }else{
                console.log("tree already loaded");
                var deferred = $q.defer();
                deferred.resolve(tree);
                return deferred.promise;
            }

        }
    };


}).controller("MyCtrl", ['$scope', 'TreeFactory', function ($scope, TreeFactory) {

    $scope.updateTree = function(){
        TreeFactory.callTree().then(function(data){
            $scope.tree = data;
        });
    };
}]);

HTML

<div ng-app="myApp" ng-controller="MyCtrl" ng-init="updateTree()">tree: {{tree}} <br><button ng-click="updateTree()">UPDATE TREE</button></div>

CHECK THE FIDDLE

关于javascript - 使用工厂 AngularJS 提供处理后的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33868583/

相关文章:

javascript - 我在一个对象中创建了两个不同的对象。打印它们时,仅显示最后修改的对象。如何创作?

javascript - HTML localStorage CSS 问题?

javascript - 在 Canvas HTML 中绘制文本会停止我的算法

javascript - 如何在连续 2 个 Angular 服务调用期间中止/取消第一次调用的 promise ?

使用 Angular-UI Select2 元素进行 Angularjs E2E 测试

javascript - 更改文字颜色

javascript - 如何添加事件监听器点击多个具有不同自定义数据键属性的div

javascript - 如果不存在则加载 Angular

javascript - 从 ng-click 调用指令内的绑定(bind)函数

javascript - AngularJSJ - Uncaught Error : [$injector:modulerr] (chrome console error)