昨天我问了一个错误的问题(并得到了一个有效的好处),但我意识到这不是我需要的。我需要能够检索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。谁能帮助我指出正确的方向?我在网上花了几个小时但似乎找不到相关的参考/例子。
由于
答案 0 :(得分:0)
我正在让服务在注入时立即获取数据(无论您注入多少次,该代码都只运行一次)。这很好,因为您不必调用函数来获取数据 - 在创建服务时需要它。
返回该数据的服务方法需要返回数据的承诺,当然,因为您不能保证它会在您要求时通过。您可以将参数传递给该方法以用于确定您的条件。您需要做的就是在方法中使用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;
});