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

Dúvida no Ex. 5 da Aula 11 - Componentizar ainda é o melhor investimento: precisamos saber mais sobre diretivas!

Acredto que implementei como solicitado. Porém o focus não funcionou nem no chrome e nem no Microsoft edge. No console não tem nenhum erro.

Segue meus códigos:

Voltar


.factory('cadastroDeFoto', function(recursoFoto, $q, $rootScope) { 'use strict'; var service = {}; var evento = 'fotoCadastrada';

service.cadastrar = function(foto) {

return $q(function(resolve, reject) {

if (foto._id) { recursoFoto.update({ fotoId: foto._id }, foto, function() { $rootScope.$broadcast(evento); resolve({ mensagem: 'Foto atualizada com sucesso!', inclusao: false }); }, function() {

reject({ mensagem: 'Não foi possível alterar a foto!' })

}); } else { recursoFoto.save (foto , function () { $rootScope.$broadcast(evento); resolve({ mensagem: 'Foto cadastrada com sucesso!', inclusao: true }); }, function () {

reject({ mensagem: 'Não foi possível cadastrar a foto!' })

}); }

}) };

return service; });


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

ddo.restrict = 'A';

ddo.link = function (scope, element) { scope.$on = ('fotoCadastrada' , function() { element[0].focus(); }); };

return ddo; });

8 respostas

.

No edge preciso verificar. No Chrome zilhoes de alunos já passaram dessa parte sem problema algum.

O que vai me dificultar ajuda-lá é que você não usou a formatação de código e ele fica ilegível.

Poste novamente, mas antes clique no botão formatação e veja como formatar seu código para que eu possa ajuda-lá ainda melhor.

Faltou a parte do codigo da diretiva em uso no seu html.

Quando for formatar faça com cada código em separado.

Segue novamente meus códigos para verificar o que eu fiz de errado.

foto.html

<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="salvar()">
    <div class="col-md-6">
        <div class="form-group">
            <label>Título</label>
            <input name="titulo" class="form-control" ng-model="foto.titulo" required ng-maxlenght="20">
            <span ng-show = "formulario.$submitted && formulario.titulo.$error.required" 
                class="form-control alert-danger">
                Título obrigatório
            </span> 

        </div>
        <div class="form-group">
            <label>URL</label>
            <input name="url" class="form-control" ng-model="foto.url" 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 name="descricao" class="form-control" ng-model="foto.descricao">
            </textarea>
        </div>

        <div class="form-group">
            <label>Grupo</label>
            <select name="grupo" class="form-control" required  ng-model="foto.grupo" 
                ng-controller="GruposController" 
                ng-options="grupo._id as (grupo.nome | uppercase) for grupo in grupos" required>
                <option value="">Escolha um grupo</option>
            </select>
            <span ng-show="formulario.$submitted && formulario.grupo.$error.required" class="form-control alert-danger">
                Grupo obrigatório
            </span>
        </div>

        <button type="submit" class="btn btn-primary">
            Salvar
        </button>
         <a href="/" meu-focus class="btn btn-primary" >Voltar</a>
        <hr>
    </div>
    <div class="col-md-6">
        <minha-foto url="{{foto.url}}" titulo="{{foto.titulo}}">
    </div>
</form>

serviços:

/**
 * meusServicos Module
 *
 * Description
 */
 angular.module('meusServicos', ['ngResource']).factory('recursoFoto', function($resource) {
    'use strict';
    return $resource('/v1/fotos/:fotoId', null, {
        'update': {
            method: 'PUT'
        }
    });

})
 .factory('cadastroDeFoto', function(recursoFoto, $q, $rootScope) {
    'use strict';
    var service = {};
     var evento = 'fotoCadastrada';

    service.cadastrar = function(foto) {

        return $q(function(resolve, reject) {

            if (foto._id) {
                recursoFoto.update({
                    fotoId: foto._id
                },
                foto,
                function() {
                    $rootScope.$broadcast(evento);
                    resolve({
                        mensagem: 'Foto atualizada com sucesso!',
                        inclusao: false
                    });
                },
                function() {

                    reject({
                        mensagem: 'Não foi possível alterar a foto!'
                    })

                });
            } else {
                recursoFoto.save (foto , function () {
                    $rootScope.$broadcast(evento);
                    resolve({
                        mensagem: 'Foto cadastrada com sucesso!',
                        inclusao: true
                    });
                }, function () {

                     reject({
                        mensagem: 'Não foi possível cadastrar a foto!'
                    })

                });
            }

        })
    };

    return service;
});

minhas-diretivas.js

angular.module('minhasDiretivas',[])

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

    ddo.restrict = 'AE'

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

    ddo.transclude = true;

    ddo.templateUrl = 'js/directives/meu-painel.html'

    return ddo;

})

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

    ddo.restrict = 'E'

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

    ddo.templateUrl = 'js/directives/minha-foto.html'

    return ddo;

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

    ddo.restrict = 'E'

    ddo.scope = {
        nome: '@',
        acao : '&'
    };

    ddo.template = '<button ng-click="acao()" class="btn btn-danger btn-block"> {{nome}} </button>'

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

    ddo.restrict = 'A';

    ddo.link = function (scope, element) {
        scope.$on = ('fotoCadastrada' , function() {
            element[0].focus();
        });
    };

    return ddo;
});

main.js

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

    $locationProvider.html5Mode(true);

    $routeProvider.when('/fotos',{
        templateUrl: 'partials/principal.html',
        controller: 'FotosController'
    })
    .when('/fotos/news',{
        templateUrl: 'partials/foto.html',
        controller:'FotoController'
    })
    .when('/fotos/edit/:fotoId',{
        templateUrl: 'partials/foto.html',
        controller:'FotoController'
    })
    .otherwise({redirectTo: '/fotos'});

});

index.html

<!DOCTYPE html>
<html lang="pt-br" ng-app="alurapic">
    <head>
        <base href="/"/>

        <meta charset="UTF-8">
        <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/lib/angular-resource.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/controllers/grupos-controller.js"></script>
        <script src="js/directives/minhas-diretivas.js"></script>
        <script src="js/services/meus-servicos.js"></script>

    </head>
    <body>
        <div class="container">
           <ng-view></ng-view>
        </div>        
    </body>
</html>

Agora ficou show! Eu vi seu post, assim que puder dou uma olhada e vejo o que aconteceu (ainda hoje).

solução!

Opa, já vi algo no seu código. Vamos lá:

Na declaração da diretiva temos:

ddo.link = function (scope, element) {
        scope.$on = ('fotoCadastrada' , function() {
            element[0].focus();
        });
    };

$on é uma função que recebe dois parâmetros, o nome do evento e o segundo uma função anônima que será chamada quando o evento for disparado. O correto é:

ddo.link = function (scope, element) {
        scope.$on('fotoCadastrada' , function() {
            element[0].focus();
        });
    };

Veja que removi o sinal de igual.

Aparentemente o problema é esse. Teste e verifique. Te peço também Izabel, que teste no Edge (mas primeiro no Chrome) para saber se está tudo certinho.

Bom estudo!

Opa! Marcou a minha solução, mas tudo certo no Edge também? Tenho relatos que ele é o browser mais bugado lançado pela MS até hoje (apesar de muito melhor que o IE 10).

Funcionou certinho no chrome e no edge. Agora só aproveitando.. deve ser algum bug do edge. No edge tem um comportamento muito estranho. Quando a gente clica no voltar, ele não atualiza com as alterações e nem com as inclusões. Para ele atualizar, primeiro tenho que ir no browser fazer uma requisição direta para localhost:3000/v1/fotos e depois chamar novamente localhost:3000/fotos que ai ele pega a lista certinha.

Acho que é bug no edge porque no internet explorer normal funciona certinho e no chrome também.

Hum, curioso, mas foi bom você ter falado. Vou ficar de olho aqui caso aconteça com mais algum aluno. Eu ainda não instalei minha máquina virtual Windows 10 para poder verificar (uso MAC).