2014-09-20 84 views
0

我有一個工廠,我有一個函數getExpenseList,它執行一個查詢費用表的ajax調用並給出結果。Angular factory ajax call on every route change

現在我有兩條路線,第一條是通過上述功能推動費用的費用列表,第二條路線是增加。當我進行路由更改並返回到列表頁面時,再次進行ajax調用。理想情況下,我應該能夠將費用對象存儲在第一個Ajax調用中,然後引用同一對象,直到有人手動刷新瀏覽器。

請幫助我。這是我的工廠代碼。理想情況下,如果數據存在,我想引用this.expenses。

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; 
}); 
+0

我建議你使用模塊模式,並在需要時只調用getExpenseList。在你的工廠總是返回費用,這就是爲什麼它總是會被調用,因爲你使它成爲json對象的一部分費用 – 2014-09-20 08:02:55

回答

0

你的工廠會是這樣

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; 
     } 
    } 
}]); 

,你可以從控制器相同的方式調用它,它不會自動調用它。 btw我推薦使用承諾。

下面

是相同的代碼使用承諾的

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; 
     } 
    } 
}]); 
+0

其中是url?我想嘗試承諾的事情。但我不知道你在哪裏把這個網址 – 2014-09-20 08:32:23

0

你需要一次獲得費用在出廠的時候被加載的第一次;

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}; 
}]); 

這裏做的事情是,它使得從工廠expenses回報是指一次性Ajax調用來獲取費用。

+0

這不起作用。 – 2014-09-20 09:47:50

+0

@AmitavRoy爲什麼?控制檯上的錯誤是什麼? – Ashesh 2014-09-20 10:24:58