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.