2016-03-01 4 views
0

У меня есть служба в моем угловом приложении, которое собирает файл JSON с данными футбольной команды.Несколько файлов JSON в одном сервисе (AngularJS)

angular.module('UsersApp').factory('SquadService', ['$http', function($http) { 

    return $http.get('squad/squad-bournemouth.json') 
      .success(function(data) { 
       return data; 
      }) 
      .error(function(err) { 
       return err; 
      }); 
}]); 
  1. Можно ли получить ту же услугу (SquadService), чтобы вернуть данные из нескольких файлов в формате JSON?

  2. Возможно ли это?

  3. Если да, то как бы вы сделали несколько функций $http.get в том же сервисе? Если нет, будет ли это просто иметь отдельную услугу для каждого массива отрядов и вызвать их все индивидуально в контроллере, например ...?

    bournemouthService.success(function(data) { 
    $scope.bournemouthSquad = data; 
    }); 
    
    arsenalService.success(function(data) { 
        $scope.arsenalSquad = data; 
    }); 
    
    chelseaService.success(function(data) { 
         $scope.chelseaSquad = data; 
    }); 
    
    // and so on... 
    

Это кажется, что это идет вразрез с DRY принцип кода, так что хотел бы знать, если есть лучший способ сделать это?

Заранее спасибо

+1

Я рекомендую использовать угловую службу $ ресурса: https: // docs.angularjs.org/api/ngResource/service/$resource –

+0

Посмотрите на это: http://stackoverflow.com/questions/21024411/angular-q-how-to-chain-multiple-promises-within- and-after-a-for-loop –

+1

Гэвин Палмер - спасибо за то, что у него на $ resource. Моя проблема заключается в том, что я видел, что он втягивал определенные ** объекты ** в ** массив ** (помечен как id), в моем случае я хочу вытащить определенные ** массивы ** из массивов. Я попробовал это, обертывая каждый под-массив в объект, чтобы я мог дать им идентификатор. Это не сработало ... – Paulos3000

ответ

2

Я думаю, в вашем случае это будет иметь смысл создать единую функцию, которую можно повторно использовать для каждой команды, просто проходя по параметру, вместо создания функции для каждой команды (что произойдет, когда команды вылетает/повышены):

angular.module('UsersApp').factory('SquadService', ['$http', function($http) { 

    var getTeam = function(url){ 
    return $http.get(url); // returns a promise 
    }; 

    return { 
    getTeam : getTeam 
    } 
}]); 

И в вас контроллере:

SquadService.getTeam('squad/squad-bournemouth.json').then(
    function(data){ 
    // successcallback 
    $scope.bournemouthSquad = data; 
    }, 
    function(error){ 
    // errorcallback 
    }); 

Я думаю, что этот подход является немного более общим так как вам не нужно создавать новую функцию для каждой команды, но просто можно передать URL-адрес в качестве параметра.

Чтобы сохранить все ваши адреса в одном месте и сделать его более повторного использования, вы можете рассмотреть вопрос о размещении их в постоянной:

angular.module('UsersApp').constant('PLUrl', { 
    bournemouth: 'squad/squad-bournemouth.json', 
    arsenal: 'squad/squad-arsenal.json', 
}); 
+0

Спасибо, это звучит так, как я после ... Два быстрых вопроса: 1) В службе вы написали 'return getTeam: getTeam' - почему бы не просто« вернуть getTeam »? 2) Если бы я использовал метод '.constant()' (который выглядит очень аккуратно), как бы я назвал эти URL-адреса в контроллере? - Спасибо – Paulos3000

+0

1) Вы правы, вы можете просто использовать 'return getTeam', это просто вопрос личных предпочтений, я думаю. 2) Вот полезная статья SO: http://stackoverflow.com/questions/24831323/angularjs-constants – sjokkogutten

+0

Спасибо за вашу помощь, высоко ценим! – Paulos3000

Смежные вопросы