将对象从工厂传递到控制器

时间:2016-03-02 01:23:24

标签: javascript angularjs

我正在尝试创建一个工厂,对某些API发出ajax请求,然后返回一个数据对象。我的代码是:

app.factory('Test', function($http, $q) {
    var data = {response:{}};
    var getMessages = function() {
        $http.get('https://someapi.com').then(
            function(jsonAPI) {            
                var dataObj = {};
                var messages = [];

                $.each(jsonAPI.data.data, function(x, data) {
                    dataObj[x] = data;
                    $.each(jsonAPI.data.included, function(y, included) {
                        if(data.relationships.sender.data.id == included.id) {
                            dataObj[x].sender = included;
                        }
                    });
                    messages.push(dataObj[x]);
                });
                data.response = messages;
            },
            function(errorResponse) {
            // todo handle error.
            }
        );      
    };
    getMessages();

    return {
        data
    };
});

但是,当我尝试从创建的数据对象中删除'response'属性并且data = messages而不是data.response = messages时,数据对象没有被填充。如果我在我的控制器中保留响应属性,当我尝试console.log(Test.data['response'])时,我得到一个空对象。 console.log(Test.data)返回一个有效的对象。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

如果您想保存存储在工厂中的数据,您可以存储$http返回的承诺,并将该承诺与存储的数据一起解决。

app.factory('Test', function($http, $q) {

    var data = null, dataPromise = null;

    function getMessages() {

        if (!dataPromise) {
            dataPromise = $http.get('https://someapi.com').then(
                    function (jsonAPI) {
                        var dataObj = {};
                        var messages = [];

                        $.each(jsonAPI.data.data, function (x, data) {
                            dataObj[x] = data;
                            $.each(jsonAPI.data.included, function (y, included) {
                                if (data.relationships.sender.data.id == included.id) {
                                    dataObj[x].sender = included;
                                }
                            });
                            messages.push(dataObj[x]);
                        });
                        data = messages;

                        return data;

                    },
                    function (errorResponse) {
                        // todo handle error.
                    }
            );
        }

        return dataPromise

    }

    return {
        getMessages : getMessages
    };

});

然后在任何控制器或指令中或解决:

Test.getMessages().then(function(messages){
    $scope.messages = messages;
});