Javascript 每次路线变更时都会调用ajax

Javascript 每次路线变更时都会调用ajax,javascript,ajax,angularjs,angular-routing,angular-services,Javascript,Ajax,Angularjs,Angular Routing,Angular Services,我有一个工厂,其中有一个函数getExpensList,它执行一个ajax调用,查询费用表并给出结果 现在我有两个路径,1是费用列表,它通过上述函数推送费用,第二个路径是add。当我更改路由并返回清单页面时,会再次调用ajax。理想情况下,我应该能够在第一次ajax调用时存储expense对象,然后引用同一对象,直到有人手动刷新浏览器 请帮我做这个。这是我的工厂代码。理想情况下,如果有数据,我想参考这一点 admin.factory('expenseFact', ['$http', functi

我有一个工厂,其中有一个函数getExpensList,它执行一个ajax调用,查询费用表并给出结果

现在我有两个路径,1是费用列表,它通过上述函数推送费用,第二个路径是add。当我更改路由并返回清单页面时,会再次调用ajax。理想情况下,我应该能够在第一次ajax调用时存储expense对象,然后引用同一对象,直到有人手动刷新浏览器

请帮我做这个。这是我的工厂代码。理想情况下,如果有数据,我想参考这一点

admin.factory('expenseFact', ['$http', function($http) {
    var expense = {};

    this.expenses = "";

    expense.getExpenseList = function() {
        this.expenses = $http({
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            method: "GET",
            url: base_url + "rest/expenses"
        });

        return this.expenses;
    };

    return expense;
}]);
这是我的控制器代码

admin.controller('expenseLandCtrl', function ($scope,$rootScope,expenseFact) {
    $scope.pageTitle = $rootScope.pageTitle;

    expenseFact.getExpenseList().then(function (data) {
        $scope.expenses = data.data;
    });

});

admin.controller('expenseAddCtrl', function ($scope,$rootScope,expenseFact) {
    $scope.pageTitle = $rootScope.pageTitle;
});

你们的工厂会是这样的

    admin.factory('expenseFact', ['$http', function($http) {
    return {
        getExpenseList: function() {
            var expense = {};
            this.expenses = $http({
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                },
                method: "GET",
                url: base_url + "rest/expenses"
            });

            return this.expenses;
        }
    }
}]);
你们可以用同样的方法从控制器中调用它,它不会自动调用。 顺便说一句,我建议使用承诺

下面是使用promise的相同代码

admin.factory('expenseFact', ['$http', '$q'. function($http, $q) {
    return {
        getExpenseList: function(){
            var deferred = $q.defer();
            $http({method: 'GET', 
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
                }).
            then(function(response) {
                deferred.resolve(response.data);
            }, function(response) {
                deferred.reject(response.status)
            });

            return deferred.promise;
        }
    }
}]);

当工厂第一次装载时,您需要获得一次费用

admin.factory('expenseFact', ['$http', function($http) {
    var expenses = null;
    $http({
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            method: "GET",
            url: base_url + "rest/expenses"
    }).success(function (exp) {
        expenses = exp;
    }); // get the expenses when the factory is loaded

    return {expenses: expenses};
}]);

这样做的目的是使从工厂返回的
费用
引用一次性ajax调用以获取费用。

我建议您使用模块模式,仅在需要时调用GetExpensList。在您的工厂中,它的返回费用总是很高,这就是为什么它总是被调用,因为您将它作为json对象费用的一部分url在哪里?我想试试承诺的东西。但我不确定你把网址放在哪里