仅在首次加载时调用工厂

时间:2014-12-15 10:24:01

标签: angularjs controller factory

我在控制器中有这个代码:

$scope.customers = [];
$scope.categories = [];

function init() {
   partnersFactory.getPartners(categoryId)
   .then(function(res){
      $scope.partners = res;
   },function(status){
      //err
   })

   partnersFactory.getCategories()
   .then(function(res){
      $scope.categories = res;
   },function(status){
      //err
   })
}

我需要的是在初始加载时只运行一次partnerFactory.getCategories(),然后保存不变。这样做的最佳方法是什么?使用一些变量如var initialization = false看起来不太干净。

修改 目的:我有一些按类别排序的数据。我现在在做什么:如果有人点击类别,我会从服务器重新加载数据集,但会将其过滤到类别(服务器端)。这就是我需要重新加载数据的原因,而不是类别。我做错了吗?也许在angularjs中过滤它会更好? (服务器上的数据不会不断更新)。

4 个答案:

答案 0 :(得分:1)

怎么样:

$scope.customers = [];
$scope.categories = null;

function init() {
   partnersFactory.getPartners(categoryId)
   .then(function(res){
      $scope.partners = res;
   },function(status){
  //err
   })

   if($scope.categories == null) {
       partnersFactory.getCategories()
       .then(function(res){
          $scope.categories = res;
       },function(status){
          $scope.categories = [];
       })
    }
}

答案 1 :(得分:1)

partnersFactory.getCategories()放在init()函数的一侧只会执行一次

所以你的控制器喜欢,

$scope.customers = [];
$scope.categories = [];

function init() {
   partnersFactory.getPartners(categoryId)
   .then(function(res){
      $scope.partners = res;
   },function(status){
      //err
   })       
}

partnersFactory.getCategories()
.then(function(res){
    $scope.categories = res;
},function(status){
      //err
})

如果您需要$scope.categories使用angular.copy()的干净副本,如下所示

partnersFactory.getCategories()
.then(function(res){
    $scope.categories = res;
    $scope.originalObj = angular.copy($scope.categories); // don't do any changes to $scope.originalObj
},function(status){
      //err
})

答案 2 :(得分:1)

在你的工厂,你可以这样做:

.factory('partnersFactory', function($http) {
    var categories = [];

    var getCategories = function() {
       $http.get(...)
          .success(function(data){
             categories = data;
          });
    }
    getCategories();

    return {
        getPartners: function(categoryId) {
           $http.get(...)
              .success(onSuccess)
              .error(onError);
        },
        getCategories: function(){
           return categories;
        }
    };

它应该是现金类别数据。

答案 3 :(得分:1)

所以,你需要的是这样的东西:

在控制器中

创建2个方法,一个用于获取类别,另一个用于获取数据:

angular.module('yourApp').controller('yourCtrl', ['$scope', 'yourFactory', function ($scope, yourFactory) {

  $scope.initPage = function () {
     $scope.getCat();
     $scope.getData();
  }

  $scope.getCat = function () {
     ...
  }

  $scope.getData = function () {
     ...
  }


  $scope.initPage();
}]);

然后在你的html中,在应该重新加载数据的按钮/元素上,用ng-click调用你的方法

<div>
  <button ng-click="getData"> reload </button>
</div>

如果您想对每个类别进行排序,您可以执行以下操作:将getData(类别)的参数添加到您希望过滤数据的类别,然后在您的html中

<ul>
  <li ng-repeat="cat in categories"> <a ng-click="getData(cat)"> {{ cat.name }} </a> </li>
</ul>

希望有所帮助