Pass value to service factory in angularjs

2

I need to pass two values (page and total) of $ scope that are in the controller to a service factory, how do I? Is there any good practice to do this?

Service:

angular.module("myapp").factory("AtividadesAPI", function ($http, config) {

    var _getAtividades = function () {
        return $http.get(config.baseUrl + "/atividades");
    };

    var _getAtividadesPaginadas = function () {
        return $http.get(config.baseUrl + "/atividades?pagina=param1&total=param2");
    };

    return {
        getAtividades: _getAtividades,
        getAtividades: _getAtividadesPaginadas
    };

});

UPDATE

Controller:

carregarAtividades = function () {
    AtividadesAPI.getAtividades().success(function (data) {
        $scope.atividades = data;
    }).error(function (data, status) {
        $scope.message = "Aconteceu um problema: " + data;
    });
};
    
asked by anonymous 10.11.2016 / 20:07

3 answers

2

You can simply pass them as a parameter to the function you created. Paramétros are for this and you can check here Angular Styleguide - Factories .

angular.module("myapp").factory("AtividadesAPI", function ($http, config) {

    var _getAtividades = function () {
        return $http.get(config.baseUrl + "/atividades");
    };

    var _getAtividadesPaginadas = function (pagina, total) {
        return $http.get(config.baseUrl + "/atividades?pagina=" + pagina + "&total=" + total);
    };

    return {
        getAtividades: _getAtividades,
        getAtividadesPaginadas: _getAtividadesPaginadas
    };

});

Your controller will call:

AtividadesAPI.getAtividadesPaginadas($scope.pagina, $scope.total);
    
11.11.2016 / 00:10
3

As discussed in the comments, although there is already an accepted response, it shows only one way to update a data in the factory. Another method, and perhaps one of the best features of AngularJs, is to update the data by reference, that is, rather than calling a function that updates the data, you create a scope with reference to an object in the factory.

So, when there is an update, either in controller, directive, component, etc. The value in the factory will also be updated.

But for this to work, you must follow a basic rule: All values to be referenced must be set within the factory. Here's an example:

angular.module(appModule)
.factory('empresaFactory', function() {
    //Factory
    const empresa = {}; //Esse objeto é apenas uma referência geral da factory, para que você acesse os dados ou funções;


    // Aqui declaramos os dados
    empresa.dados    = {}; //Dados da empresa
    empresa.produtos = []; //Lista de produtos da empresa


    // Aqui declaramos as funções
    /**
     * Função para atualizar os dados (declarados acima) após obter o endpoint de sua api
     */
    empresa.atualizaEmpresa= function(campo, valor) {
        return angular.extend(empresa[campo], valor); //Não sei se é extremamente necessário utilizar o extend, mas quando eu não utilizo desse modo, o comportamento é irregular
    }

    // Retornamos a factory
    return empresa;
})

As you can see, I have created 2 references (object) empresa.dados and (array) empresa.produtos where we will store the data. Once you get the data, for example, you loaded the company data from the database, you call the empresa.atualizaDados function to create the initial object, like this:

controller

$scope.empresa = empresaFactory.dados; //Cria a referência

empresaFactory.atualizaEmpresa('dados', $scope.dadosDaEmpresa); //Semelhante a primeira respota

//Ou deste modo
$scope.empresa = dadosDaApi; //dados obtidos do seu banco de dados

//Ou atualizar apenas um valor
$scope.empresa.nome = 'Novo nome da empresa';
$scope.empresa.cnpj = '11.222.333/0000-99';

The same thing is for the array, you can do all the manipulation, see:

controller

$scope.produtos = empresaFactory.produtos;

$scope.produtos.push(novoProduto); //Adiciona um produto
$scope.produtos.splice(index, 1); //Remove um produto

All these updates I mentioned, they will reflect the result directly in the "source", that is, in Factory, without having to call the update manually.

Important!

Note that I still call a Factory update with this: empresaFactory.atualizaEmpresa('dados', $scope.dadosDaEmpresa); . I , particularly, I do this because when I get the initial data, they are done inside my state's resolver, so it's just a more practical way, since I do not need to create a reference just to update. I just update directly as a parameter.

But that's up to you.

I hope that I have been able to explain it clearly and that you learn more about it. This method will help you if you have a complex application with data sharing in many locations.

    
11.11.2016 / 02:26
0

I think this helps:

$http.get({
    url: config.baseUrl + '/atividades', 
    method: "GET",
    params: {pagina: param1, total: param2}
 })

Here you can see other possibilities and types of arguments that can be passed in $http.get .

link $ http # get link $ http # usage

    
10.11.2016 / 23:13