Salvei todos os dados recebidos dos serviços diretamente na variável local, controlador ou escopo. O que suponho que seria considerado uma cópia superficial, está correto?
Example:
DataService.callFunction()
.then(function(response) {
$scope.example = response.data;
});
Recentemente me disseram para usar o angular.copy para criar uma cópia profunda.
$scope.example = angular.copy(response.data);
No entanto, as informações detalhadas da cópia parecem estar funcionando da mesma maneira quando usadas pelo meu aplicativo Angular. Há benefícios específicos em usar uma cópia em profundidade (angular.copy) e você pode me explicar?
javascript
angularjs
deep-copy
shallow-copy
Superman2971
fonte
fonte
Respostas:
Use angular.copy ao atribuir valor de objeto ou matriz a outra variável e esse
object
valor não deve ser alterado.Sem copiar em profundidade ou usar angular.copy , alterar o valor da propriedade ou adicionar qualquer nova propriedade atualiza todos os objetos que fazem referência a esse mesmo objeto.
fonte
$scope.one = response.data
e defina$scope.two = response.data
. Então faça$scope.two.addProperty = something
. Provavelmente eu deveria apenas testar isso :), mas gostaria de ter uma visão da comunidade.object property
atualização do novo valor para todos os objetos com a mesma referência. É por isso que você precisa usar o angular.copy #Nesse caso, você não precisa usar
angular.copy()
Explicação :
=
representa uma referência enquantoangular.copy()
cria um novo objeto como uma cópia profunda.Usar
=
significaria que alterar uma propriedade deresponse.data
alteraria a propriedade correspondente$scope.example
ou vice-versa.O uso
angular.copy()
dos dois objetos permaneceria separado e as alterações não refletiriam uma na outra.fonte
Eu diria que a
angular.copy(source);
sua situação é desnecessária se mais tarde você não a usar, sem um destinoangular.copy(source, [destination]);
.https://docs.angularjs.org/api/ng/function/angular.copy
fonte
angular.copy()
um objeto para impedir que outro código o modifique. O objeto original pode mudar, mas sua cópia não verá as alterações. Você pode restabelecer a cópia, se necessário.Ao usar angular.copy, em vez de atualizar a referência, um novo objeto é criado e atribuído ao destino (se um destino for fornecido). Mas tem mais. Há uma coisa legal que acontece depois de uma cópia profunda.
Digamos que você tenha um serviço de fábrica com métodos que atualizam as variáveis de fábrica.
e um controlador que usa esse serviço,
Quando o programa acima for executado, a saída será a seguinte,
Portanto, o interessante de usar a cópia angular é que, as referências do destino são refletidas com a alteração dos valores, sem a necessidade de reatribuir os valores manualmente, novamente.
fonte
Eu sei que já está respondido, ainda estou apenas tentando simplificar. Portanto, angular.copy (data) você pode usar no caso em que deseja modificar / alterar seu objeto recebido, mantendo seus valores originais inalterados / inalterados.
Por exemplo: suponha que eu tenha feito uma chamada de API e recebi meu originalObj, agora eu quero alterar os valores da API originalObj para alguns casos, mas também quero os valores originais, então o que eu posso fazer é: posso fazer uma cópia da minha API originalObj em duplicateObj e modifique duplicateObj dessa maneira, meus valores originais de Ojj não serão alterados. Em palavras simples, a modificação duplicateObj não será refletida no originalObj, diferente da maneira como o js obj se comporta.
Resultado é como ....
fonte
Estou apenas compartilhando minha experiência aqui, usei angular.copy () para comparar duas propriedades de objetos. Eu estava trabalhando em várias entradas sem o elemento do formulário, queria saber como comparar as propriedades de dois objetos e, com base no resultado, tenho que ativar e desativar o botão Salvar. Então eu usei como abaixo.
Atribuí um valor de usuário de objeto de servidor original ao meu objeto fictício para dizer userCopy e usei watch para verificar as alterações no objeto de usuário.
Minha API do servidor que obtém dados do servidor:
Não tenho certeza, mas comparar dois objetos foi realmente uma dor de cabeça para mim sempre, mas com angular.copy () ocorreu sem problemas.
fonte
Javascript passa variáveis
by reference
, isso significa que:Agora, por causa da
by reference
partei
é [1] e tambémj
é [1], mesmo que apenas tenhai
sido alterado. Isso ocorre quando dizemos que oj = i
javascript não copia ai
variável e a atribui,j
mas faz referência ài
variávelj
.A cópia angular permite perder esta referência, o que significa:
Agora
i
aqui é igual a [1], enquantoj
ainda é igual a [].Há situações em que esse tipo de
copy
funcionalidade é muito útil.fonte
angular.copy
é mais inteligente que a serialização JSON, pois pode lidar com funções.