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
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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
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>
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 !!