在Angular服务中访问和使用JSON以用于逻辑流程

时间:2014-01-14 18:56:40

标签: angularjs angular-http

昨天我问了一个错误的问题(并得到了一个有效的好处),但我意识到这不是我需要的。我需要能够检索JSON数据(最好是一次),存储它,并在整个服务中访问它。我遇到的挑战是我能找到的所有示例都谈到了使用JSON并传递给app / controller,而在这种情况下我需要得到它,检查它,然后它决定了我的模块/服务的作用。

例如,我有我的应用程序和控制器,然后我有一个模块,如(这是伪代码,不打算运行):

angular.module("myModule")

.service("myService1", function($q, myService2, $http) {
    this.getModel = function() {
        return {
            title: "My Title",
            desc: "My Desc"
            options: function () {
                if (condition A)
                    return "option1";
                else 
                    return "option2";
            }
        };
    };
})
.service("myService2", function($q, $http) {
    this.getCfgInfo = function () {
        var defer = $q.defer();
        $http.get("my/json/url").then(function(response) {
            defer.resolve(response.data);
        });
        return defer.promise;
    };
})

在这个例子中,我想获得JSON,并在myService1中使用它来获取文字值(title,desc)以及条件(if中的条件A)。

我知道我可以做这样的事情(感谢Joel昨天的帮助):

service("myService1", function($q, myService2, $http) {
    // get a promise object for the configuration info
    var cfgProm = rtDataMapper.getCfgInfo()
    this.getModel = function() {
        return {
            title: cfgProm.then(function(response) {
                        return response.JSON_NAME;
                    }),

并且它工作正常,因为我已经将标题映射回我的模型并且有一个watch(),但我很难过如何在服务本身中获取,存储和使用JSON作为条件(即if(条件A),其中条件A来自JSON。尝试将它们包装在.then()中似乎没有意义,或者至少我无法弄清楚如何去做。

我是Angular的新手,正在尝试修改留给我们的一些代码。我猜我不需要myService2来获取JSON。谁能帮助我指出正确的方向?我在网上花了几个小时但似乎找不到相关的参考/例子。

由于

1 个答案:

答案 0 :(得分:0)

Live demo (click).

我正在让服务在注入时立即获取数据(无论您注入多少次,该代码都只运行一次)。这很好,因为您不必调用函数来获取数据 - 在创建服务时需要它。

返回该数据的服务方法需要返回数据的承诺,当然,因为您不能保证它会在您要求时通过。您可以将参数传递给该方法以用于确定您的条件。您需要做的就是在方法中使用promise.then,在修改后的数据中使用resolve。由于该方法已经返回了promise,因此将在resolve上更新修改。请参阅下面和演示中的所有内容。

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

app.controller('myCtrl', function($scope, myService) {
  myService.getData(15).then(function(data) {
    $scope.myData = data;
  });
});

app.factory('myService', function($q, $timeout) {
  //this code only runs once when you first inject the service
  //get data immediately
  var deferred = $q.defer();

  $timeout(function() { //simulate ajax call
    var data = { //ajax response data
      foo: 15,
      bar: 'Some data!'
    };
    data = modifyData(data, 1);
    deferred.resolve(data);
  }, 500);

  function modifyData(data, fooVal) {
    if (data.foo === fooVal) {
      data.baz = 'Conditional data!'; 
    }
    return data; 
  }

  var myService = {
    //data can be modified when it comes from the server,
    //or any time you call this function
    getData: function(fooVal) {
      if (fooVal) { //if you want to modify the data
        deferred.promise.then(function(data) {
          data = modifyData(data, fooVal);
          deferred.resolve(data);
        });
      }
      return deferred.promise;
    }
  };
  return myService;
});