0

我昨天问了一个错误的问题(并得到了一个很好的答案),但我意识到这不是我需要的。我需要能够检索 JSON 数据(最好是一次)、存储它并在我的整个服务中访问它。我面临的挑战是,我能找到的所有示例都在谈论使用 JSON 并传递给应用程序/控制器,而在这种情况下,我需要获取它、检查它,然后它决定了我的模块/服务的作用。

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

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 (condition A) where condition A 来自 JSON。试图将这些包装在 .then() 中似乎没有意义,或者至少我不知道该怎么做。

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

谢谢

4

1 回答 1

0

现场演示(点击)。

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

当然,返回该数据的服务方法需要返回数据的承诺,因为当您请求它时,您不能保证它会通过。您可以将参数传递给该方法以用于确定您的条件。为此,您需要做的就是promise.then在方法和resolve承诺中使用修改后的数据。由于该方法已返回承诺,因此修改将在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;
});
于 2014-01-14T19:19:45.043 回答