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

Aula 6 - renderização da imagem, charset ausent no form e falha na validação

Prezados,

a foto a direita não está sendo renderizada conforme é exibido em aula.

Conferi no vídeo e no link de Explicação e não descobri o erro.

Seguem os códigos:

HTML INDEX

<!DOCTYPE html>
<html lang="pt-br" ng-app="alurapic">
    <head>
        <meta charset="UTF-8">
        <base href="/"
        <meta name="viewport" content="width=device-width">
        <title>Alurapic</title>
        <link rel="stylesheet" href="css/bootstrap.min.css">
        <link rel="stylesheet" href="css/bootstrap-theme.min.css">
        <link rel="stylesheet" href="css/efeitos.css">
        <script src="js/lib/angular.min.js"></script>
        <script src="js/lib/angular-animate.min.js"></script>
        <script src="js/lib/angular-route.min.js"></script>
        <script src="js/main.js"></script>
        <script src="js/controllers/fotos-controller.js"></script>
        <script src="js/controllers/foto-controller.js"></script>
        <script src="js/directives/minhas-diretivas.js"></script>
    </head>
    <body>
        <div class="container">
            <ng-view></ng-view>
        </div> <!-- fim container -->        
    </body>
</html>

HTML PRINCIPAL

<div class="jumbotron">
  <h1 class="text-center">Alurapic</h1>
</div>
<div class="row">
    <div class="col-md-12">
        <form>
            <div class="input-group">
                <input ng-model="filtro" ng-model-options="{debounce: 200}" class="form-control" placeholder="Filtrar...">            
                <span class="input-group-btn">
                    <a href="fotos/new" class="btn btn-primary">Nova foto</a>
                </span>
            </div>
        </form>
    </div>
</div>            
<div class="row">
   <meu-painel class="col-md-2 painel-animado" ng-repeat="foto in fotos | filter: filtro" titulo="{{foto.titulo}}">
          <img class="img-responsive center-block" src="{{foto.url}}" alt="{{foto.titulo}}">
   </meu-painel>
</div>

HTML MEU-PAINEL

<div class="panel panel-default">
    <div class="panel-heading">
        <h3 class="panel-title text-center">{{titulo}}</h3>
    </div>
    <div class="panel-body" ng-transclude>
    </div>
</div>

HTML FOTO

<div class="page-header text-center">
    <h1>{{foto.titulo}}</h1>
</div>

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

<form novalidate name="formulario" class="row" ng-submit="submeter()">
    <div class="col-md-6">
        <div class="form-group">
            <label>Título</label>
            <input ng-model="foto.titulo" name="titulo" class="form-control" required ng-maxlength="20">
            <span ng-show="formulario.$submitted && formulario.titulo.$error.required" class="form-control alert-danger">Título obrigatório</span>
            <span ng-show="formulario.$submitted && formulario.titulo.$error.maxlength" class="form-control alert-danger">Máximo de 20 caracteres</span>
        </div>
        <div class="form-group">
            <label>URL</label>
            <input ng-model="foto.url" name="url" class="form-control" required>
            <span ng-show="formulario.$submitted && formulario.url.$error.required" class="form-control alert-danger">URL obrigatória</span>
        </div>
        <div class="form-group">
            <label>Descrição</label>
            <textarea ng-model="foto.descricao" name="descricao" class="form-control"></textarea>
        </div>
        <button type="submit" class="btn btn-primary" ng-disabled="formulario.$invalid">Salvar</button>
        <a href="/" class="btn btn-primary">Voltar</a>
    </div>
    <div class="col-md-6">
        <minha-foto url="{{foto.url}}" titulo="{{foto.titulo}}"></minha-foto>
    </div>
</form>

MAIN

angular.module('alurapic', ['minhasDiretivas', 'ngAnimate', 'ngRoute'])
.config(function($routeProvider, $locationProvider) {

    $locationProvider.html5Mode(true);

    $routeProvider.when('/fotos', {
        templateUrl: 'partials/principal.html',
        controller: 'FotosController'
    });

    $routeProvider.when('/fotos/new', {
        templateUrl: 'partials/foto.html',
        controller: 'FotoController'
    });

    $routeProvider.otherwise({redirectTo: '/fotos'});

});

CONTROLLER

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

    $scope.foto = {};
    $scope.mensagem = '';

    $scope.submeter = function () {
        if ($scope.formulario.$valid) {
            $http.post('v1/fotos', $scope.foto)
            .success(function() {
                $scope.foto = {};
                $scope.mensagem = 'Foto cadastrada com sucesso!';
            })
            .error(function(erro){
                $scope.mensagem = 'Foto não cadastrada!';
            });
        }
    };

});

Pelo que entendi, está faltando criar uma diretiva com o nome de minha-foto.

Outro problema na mesma aula: dentro form, as palavras não estão renderizando os assentos. É como se o charset em index.html não estivesse válido. O novalidate dentro do form elimina a configuração do charset?

3 respostas

Criei a diretiva minha-foto e agora é exibido erro quando carregada a página:

CONTROLLER:

angular.module('minhasDiretivas', [])
    .directive('meuPainel', function() {
        var ddo = {};

        ddo.restrict = "AE";

        ddo.scope = {
            titulo: '@'
        }

        ddo.transclude = true;

        ddo.templateUrl = 'templates/meu-painel.html';

        return ddo;
    });

    .directive('minhaFoto', function() {
        var ddo = {};

        ddo.restrict = "AE";

        ddo.scope = {
            titulo: '@'
            url: '@'
        }

        ddo.transclude = true;

        ddo.template = '<img class="img-responsive center-block" src="{{url}}" alt="{{titulo}}">';

        return ddo;
    });

Erro:

minhas-diretivas.js:18 Uncaught SyntaxError: Unexpected token .

angular.min.js:35 Uncaught Error: [$injector:modulerr] http://errors.angularjs.org/1.3.15/$injector/modulerr?p0=alurapic&p1=Error%…0d%20(http%3A%2F%2Flocalhost%3A3000%2Fjs%2Flib%2Fangular.min.js%3A17%3A381)

Este erro na linha 18, pelo que entendi, está reclamando da presença de um ponto final. Só não entendi qual ponto final.

solução!

Aos 13min 40seg da aula 8 veio a resposta do que estava errado na minha diretiva minhaFoto.

Eu incluí ddo.transclude, incluí um ponto-e-vírgula indevidamente e ainda faltou uma vírgula após o primeiro '@'.

Só que agora preciso de uma nova explicação sobre o transclude.

Jose,

Esta diretiva de incluir o template foi citado na aula 5 como exercício. Também acabei por ficar perdido um tempo pois havia realizado o exercício mas não inclui no meu código fonte.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software