AngularJs - factory:读取使用$ resource获取的数据并返回其中的一部分

时间:2016-02-17 11:26:51

标签: angularjs angular-resource resolve

在我的工厂,如何从指令中返回调用函数之前从 .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)

enter image description here

顺便说一下,我想做的事情是可能的吗?怎么样?

修改

根据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
});

2 个答案:

答案 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;
});