【问题标题】:AngularJs - factory: read the data fetched using $resource and return some part of itAngularJs - 工厂:读取使用 $resource 获取的数据并返回其中的一部分
【发布时间】:2016-02-17 11:26:50
【问题描述】:

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

【问题讨论】:

  • Angular 是异步工作的,所以这不是它的工作方式。在这里找到了一个关于如何以角度加载 json 数据的好例子:stackoverflow.com/a/16931623/2422125

标签: angularjs angular-resource resolve


【解决方案1】:

当您进行查询时,它会返回一个 promise(您在控制台日志中看到的 $promise)。本质上,promise 具有返回的数据。

var langData = [];
$resource('services/langInfo.json').query(function(data){langData = data;});

你可以考虑等待一个 promise 被执行,但是你会错过 angular 的美妙之处。

我要做的是:

$resource('services/langInfo.json').query(function(data){return data;});

然后在收到数据后进行过滤。

或者,看看https://lodash.com/它更像是角度方面的linq。

【讨论】:

  • 你提到的第一件事不起作用。控制台仍然显示 []。第二件事我不明白;它将在哪里返回数据?如果你的意思是“var langData = $resource('services/langInfo.json').query(function (data) { return data; });”然后那也没用
  • 试试这个: var langData = [];$resource('services/langInfo.json').get(function(data){console.log(data); langData = data;});
  • 那行不通。好吧,正如 Stian 解释的那样,我需要从我调用“langService.getInfo”方法的地方传递一个回调函数
【解决方案2】:

你需要在 promise 解决后处理数据。根据 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;
});

【讨论】:

  • 等待.. 在回调函数中我得到了数据。但是如何将其设置为变量?假设变量是在调用 api 之前声明的。 var 响应; langService.getInfo('langCode', function(data) { console.log(data); });
猜你喜欢
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多