将Angular函数转换为工厂并利用缓存

时间:2015-02-23 13:47:25

标签: javascript angularjs

我的问题与其他类似名称的问题有些不同。我正在尝试将一个函数转换为一个工厂,以便在控制器之间提供数据,但与其他类似的工厂不同,这不起作用。

我有其他工作工厂在相同的services.js工作正常。在控制台中查看它们时,它们都会记录相同的数据,所以我想知道return是否有问题没有正确返回?

仅在控制器中有效:

控制器

getProgrammeData = function(activeProgrammeID) {
    var programmeData = [];
        var GetProgrammeData = Parse.Object.extend("Programme");
        var query = new Parse.Query(GetProgrammeData);
        query.equalTo("objectId", activeProgrammeID);
        query.first({
          success: function(object) {

                   $scope.programmes = {    
                      programmeTitle : object.get('programmeTitle'), 
                      id : object.id,
                      exerciseData : object.get('exerciseData')
                      };

          },
          error: function(error) {
            alert("Error: " + error.code + " " + error.message);
          }
        });
      }

但这不......

services.js



  .factory('parseQueryFactory', function($http) {
        return {
                getProgrammeData:function(activeProgrammeID) {
                var programmeData = [];
                var programmes = {};
                var GetProgrammeData = Parse.Object.extend("Programme");
                var query = new Parse.Query(GetProgrammeData);
                query.equalTo("objectId", activeProgrammeID);
                query.first({
                  success: function(object) {

                                programmes = {    
                              programmeTitle : object.get('programmeTitle'), 
                              id : object.id,
                              exerciseData : object.get('exerciseData')
                              };

                              console.log(programmes)

                  },
                  error: function(error) {
                    alert("Error: " + error.code + " " + error.message);
                  }
                })

            return programmes
        }
    }
    });

controllers.js

$scope.programmes = parseQueryFactory.getProgrammeData(activeProgrammeID);

其次,我如何利用这些结果的缓存?

2 个答案:

答案 0 :(得分:2)

主要问题是您首先返回一个空对象,并且在查询的回调中,您正在创建一个新对象并且丢失该对象的引用。试试这个:

 .factory('parseQueryFactory', function($http) {
        var programmes = {}
        return {
                getProgrammeData:function(activeProgrammeID) {
                var programmeData = [];

                var GetProgrammeData = Parse.Object.extend("Programme");
                var query = new Parse.Query(GetProgrammeData);
                query.equalTo("objectId", activeProgrammeID);
                query.first({
                  success: function(object) {
                      programmes.programmeTitle =object.get('programmeTitle');
                      programmes.id = object.id;
                       programmes.exerciseData = object.get('exerciseData');

                  },
                  error: function(error) {
                    alert("Error: " + error.code + " " + error.message);
                  }
                })

            return programmes;
        }
    }
    });

答案 1 :(得分:0)

添加@JesusQuintana的答案。

我倾向于布置这样的工厂:

.factory('parseQueryFactory', ['$http', parseQueryFactory])

function parseQueryFactory($http) {
    var service = {
        getProgrammeData: getProgrammeData
    };

    var serviceBase = '/api/someController';

    return service;

    function getProgrammeData(activeProgrammeID) {
        return $http.get(serviceBase, { params: { activeProgrammeID: activeProgrammeID }).then(function (data) {
            return data.data;
        }).catch(function (message) { console.error(message); });
    }
}

这使我更容易,当a)我只是想知道这项服务可以做什么,b)主要功能的哪些部分。例如。返回服务之前的一切都是原始服务,并且将是单身人士。之后的一切都是我的服务所依赖的实现。