在我的工厂,如何从指令中返回调用函数之前从 .json 文件中提取(读取)数据?
这是我工厂的定义
(function () {
"use strict";
angular
.module("common.services")
.factory("langService", ["$resource", langService])
function langService($resource) {
var langData = $resource('services/langInfo.json').query();
function getInfo(language){
/*look for a specific code from langData and return*/
}
return {
getInfo: getInfo
}
}
}());
getInfo()是应该从 langData 变量中查找相应信息并将其返回的函数。
这是来自langInfo.json的 json 数据(尚未完成):
[{
"marathi": { },
"hindi": { },
"konkani": { },
"sanskrit": { },
"gujarati": { }
}]
我是AngularJs的新手,因此需要帮助。我想langData没有解决,因为我尝试用console.log打印它,因此我无法访问它。这就是我得到的
的console.log(langData)
顺便说一下,我想做的事情是可能的吗?怎么样?
修改
根据Stian Sandve的回答,我在调用langService时传递了一个回调函数:
langService.getInfo('langCode', function(data) {
console.log(data);
});
并将getInfo的定义更改为
function getInfo(language, callback){
langData.query(function(data) {
var filteredData = filter(data); //assume filter() is defined
callback(filteredData);
});
}
所以我在回调函数中获取数据。但是我需要将它设置为在调用langService.getInfo之前声明的变量。所以像这样:
var langInfo
langService.getInfo('langCode', function(data) {
console.log(data);
//set data to langInfo
});
答案 0 :(得分:2)
当你进行查询时,它会返回一个promise(你在控制台日志中看到的$ promise)。实质上,promise包含返回的数据。
var langData = [];
$resource('services/langInfo.json').query(function(data){langData = data;});
你可以考虑等待承诺被执行但是你会错过角度的美丽。
我将做的是:
$resource('services/langInfo.json').query(function(data){return data;});
然后在收到数据时进行过滤。
或者,看看https://lodash.com/它更像是角度方面的linq。
答案 1 :(得分:1)
您需要在保证解决后处理数据。根据AngularJS文档:
使用(value,responseHeaders)参数调用成功回调,其中值是填充的资源实例或集合对象。使用(httpResponse)参数调用错误回调。
为简化示例,我们不执行任何错误检查(仅使用成功回调)。
(function () {
"use strict";
angular
.module("common.services")
.factory("langService", ["$resource", langService])
function langService($resource) {
var filter = function(data) {
// filter logic
};
var langData = $resource('services/langInfo.json');
function getInfo(language, callback){
langData.query(function(data) {
var filteredData = filter(data);
callback(filteredData);
});
}
return {
getInfo: getInfo
}
}
}());
然后你可以从你的指令中调用这样的函数:
var response = {};
langService.getInfo('langCode', function(data) {
console.log(data);
response = data;
});