Solucionado (ver solução)
Solucionado
(ver solução)
14
respostas

Não estou conseguindo editar os dados

Quando eu clico em salvar o console me retorna um erro mas não especifica no meu arquivo onde é.

 TypeError: Cannot read property 'compile' of undefined         angular.min.js:102
14 respostas

No node.js aparece esse erro:

{ [Error: Can't insert key E18e8augUd5ixcde, it violates the unique constraint] key: 'E18e8augUd5ixcde', errorType: 'uniqueViolated' }

É projeto do curso ou projeto pessoal? Você esta tentando salvar um elemento que já possui ID! Ai viola a chave primária.

Projeto do curso,professor. Eu sei que estou violando, mas não consigo modificá-lo

Quando você salva uma foto, você tem que usar $http.post para incluir e $http.put para alterar, caso contrário você terá esse tipo de programa.

Se você já chegou na parte de $resource, para enviar você usa .save e para atualizar .update.

Dá uma checada na lógica do seu controller FotoController.js se ele verifica se o ID foi passado. Se foi, ele sabe que é para alterar, se não foi , ele sabe que é para incluir.

Está tudo nos conformes, professor:

 if($scope.formulario.$valid){

        if($scope.foto._id){ // se a foto possui um ID, o codigo abaixo é para alterá-lo

            $http.put('v1/fotos/' + $scope.foto._id, $scope.foto)
            .success(function(){
                $scope.mensagem = 'Foto alterada com sucesso';

            })
            .error(function(erro){
                console.log(erro);
                $scope.mensagem = 'Nao foi possivel alterar a foto' + $scope.foto.titulo;    
            });

        }
        else{ //senão tiver id, o codigo abaixo é para cadastra-lo

        $http.post('v1/fotos', $scope.foto)
        .success(function(){
            $scope.foto = {};
            $scope.mensagem ='Cadastro com sucesso';

            })

            .error(function(erro){
            console.log(erro);
                $scope.mensagem='Não foi possivel cadastrar';

        });

Mesmo assim perssiste!

Código do controller completo?

Você esta usando o backend do curso ou criou outro backend?

Fique tranquilo mais de 1000 pessoas já passaram dessa parte sem qualquer problema.

Estou utilizando TUDO do curso

Segue o código completo do foto-controller.js

angular.module('alurapic').controller('FotoController', function($scope, $http, $routeParams){

    // routeParams dá acesso ao parametros que foram enviados para rota de acesso



    $scope.foto = {}; // na nossa view foto.html está definida "foto." para nossos ng-model
    $scope.mensagem ='';



   if($routeParams.fotoId){
       //buscar a foto no servidor SE o parametro foi passado
    $http.get('v1/fotos/'+ $routeParams.fotoId) //buscando a foto com o id passado
    .success(function(foto){
        $scope.foto = foto;
    })

    .error(function(erro){
            console.log(erro);
        $scope.mensagem = 'Não foi possivel obter a foto desejada';
    });

   }

    /////////////////////////////////////////////////////////////////////////////////////////////////// 

    $scope.submeter  = function(){

        if($scope.formulario.$valid){

        if($scope.foto._id){ // se a foto possui um ID, o codigo abaixo é para alterá-lo

            $http.put('v1/fotos/' + $scope.foto._id, $scope.foto)
            .success(function(){
                $scope.mensagem = 'Foto alterada com sucesso';

            })
            .error(function(erro){
                console.log(erro);
                $scope.mensagem = 'Nao foi possivel alterar a foto' + $scope.foto.titulo;    
            });

        }
        else{ //senão tiver id, o codigo abaixo é para cadastra-lo

        $http.post('v1/fotos', $scope.foto)
        .success(function(){
            $scope.foto = {};
            $scope.mensagem ='Cadastro com sucesso';

            })

            .error(function(erro){
            console.log(erro);
                $scope.mensagem='Não foi possivel cadastrar';

        });


            }
        }
    };


});

Não consigo sair daqui :(

Mas vai sair :)

Faça o seguinte, eu dei uma olhada de relance no seu código e não detectei um problema.

Poste o código do seu main.js e também o template principal.html. Eu preciso delas para montar o quebra cabeças.

angular.module('alurapic', ['minhasDiretivas', 'ngRoute'])

.config(function($routeProvider, $locationProvider){ //configurando uma rota

    $locationProvider.html5Mode(true); 
    $routeProvider.when('/fotos', { // chamando a rota e definindo que QUANDO (when), o usuario acessar a rota de '/fotos'...
     templateUrl: 'partials/principal.html', // enviaremos um tampleteUrl (nosso html) na view parcial
        controller: 'FotosController'  //indicando o controlador para a parcial chamada acima
    });


    $routeProvider.when('/fotos/news',{ // quando for acessada a rota fotos/news
        templateUrl: '/partials/foto.html', //vamos enviar esse tamplate
        controller: 'FotoController'
    });


    $routeProvider.when('/fotos/edit/:fotoId',{ //para linkar com o id da foto
        templateUrl : 'partials/foto.html',
        controller : 'FotoController'
    });


    $routeProvider.otherwise({redirectTo: '/fotos'}); //Se for digitada uma URL não existente, ele nos jogará para essa url determinada

}); //todas as diretivas criadas da sua aplicação,precisa ser definidas aqui

Estes está todinho comentado, me perdoe caso não entenda...

<!-- principal -->
 <div class="jumbotron">
            <h1 class="text-center">Alurapic</h1>   
            </div>

    <p ng-show="mensagem.length" class="alert alert-info">{{mensagem}}</p>

            <div class="row">
            <div class="col-md-12">

                 <form>
                <div class="input-group">
               <span class="input-group-btn">
                    <a href="fotos/news" class="btn btn-primary">Nova Imagem</a>
                </span>   
                <input class="form-control" ng-model="filtro" placeholder="Filtrar por Título da imagem"/>

                    </div>
                 </form>
                <br>
                 </div>
            </div><!-- fim row -->



            <!-- painel -->
            <div class="row">
                <!-- ng-repeat: para repetir os painel -->
            <meu-painel class="col-md-2" ng-repeat="foto in fotos | filter: filtro" titulo={{foto.titulo}}>

                <img class="img-responsive center-block" src="{{foto.url}}" alt="{{foto.titulo}}"/>
                <hr>
                <a class="btn btn-primary btn-block" href="fotos/edit/{{foto._id}}">Editar</a>
                <button ng-click="remover(foto)"  class="btn btn-danger btn-block">Remover</button


                </meu-painel><!-- fim painel-->

            </div>
solução!

Eu testei seu código, cortando e colocando no meu projeto e funcionou. Só se você alterou outra coisa, mas se você diz que tão tá valendo.

Faça o seguinte: talvez você esteja alterado um dado que foi salvo problemático no banco. Pare seu servidor, vá até a pasta alurapic e apague o arquivo data.db. Depois, suba o servidor novamente e recarregue a página. Não pode exibir nada para o usuário.

Vá e cadastre uma foto, depois volte, edite a foto e veja se salva.

Nunca vi isso acontecer com ninguém, mas é uma hipótese quente para seu problema.

Professor,muito obrigado... Deu certo !!