Solucionado (ver solução)

Importante

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!

Solucionado
(ver solução)
10
respostas

Abrir modal com detalhes

Olá pessoal, já finalizei o curso de AngularJS, e gostaria agora de fazer algumas alterações para fixar o conhecimento.

Uma das ideias seria criar um botão que, ao ser clicado, exibisse um modal com os detalhes de cada item (titulo, url, descricao e grupo).

Para abrir um modal, segui este tutorial: http://adamalbrecht.com/2013/12/12/creating-a-simple-modal-dialog-directive-in-angular-js/

Mas ele não recupera os dados vindos da minha api (o corpo só consegue vir estático).

Como posso fazer esta implementação?

10 respostas

Airton como esta o controller do angular ? Poste o código para que possamos lhe ajudar

Claro! Seguem códigos:

//trecho da index.html

<body ng-controller="CardsController">
      <div class="container">

        <div class="cards" ng-repeat="card in cards">
          <h3>{{card.user}}</h3>
          <button type="button" name="play" title="play" ng-click="toggleModal(card)">Play</button>
        </div>

      </div>

      <my-modal show='modalShown' width='250px' height='40%'>
        <h3>{{card.user}}</h3>
      </my-modal>
  </body>

//js/controllers/cards-controller.js

angular.module('angstudy').controller('CardsController', function($scope, $http){
  $scope.cards = [];

  $http.get('http://localhost:3000/api/persons')
  .success(function(retorno){
    console.log(retorno);
    $scope.cards = retorno;
  })
  .error(function(erro) {
        console.log(erro);
    });


  $scope.modalShown = false;

  $scope.toggleModal = function(card) {
    $scope.modalShown = !$scope.modalShown;
  };
});

//js/directives/modal-dialog.js

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

        ddo.restrict = "E";
        ddo.transclude = true;

        ddo.scope = {
            user: '@user',
            show: '='
        };

        ddo.link = function(scope, element, attrs) {
          scope.dialogStyle = {};
          if (attrs.width)
            scope.dialogStyle.width = attrs.width;
          if (attrs.height)
            scope.dialogStyle.height = attrs.height;
          scope.hideModal = function() {
            scope.show = false;
          };
        };

        ddo.templateUrl = 'js/directives/modal-dialog.html';

        return ddo;
});

//js/main.js

angular.module('angstudy', ['modalDialog']);

Os cards estão carregando normalmente e o modal abre, mas não exibe os valores das AE (no caso, estou testando apenas o valor "user", mas o json possui mais dados).

Obrigado!

Airton analisando o eu código vi que você passa como parâmetro para o botão o objeto card, porém acredito que talvez o problema seja pois você não esta injetando para o angular o objeto, talvez uma variável:

$scope.card = [];

$scope.toggleModal = function(card) {
    $scope.modalShown = !$scope.modalShown;
    $scope.card = card;
};

Caso não resolva a gente vai se falando.

Matheus, obrigado pela resposta. Mas o resultado ainda não exibe os dados. E não sei o que pode estar faltando...

Airton dentro da função do modal de um:

console.log(card);

Para termos certeza que o objeto esta sendo passado corretamente pelo parâmetro.

Poste a saída por favor.

Ele exibe os dados do objeto corretamente:

Object {user: "Sandra", age: "25 anos", height: "1.65", weight: "50 Kg", $$hashKey: "object:4"}

Parece que o problema está no modal...

Acho que esqueci de postar o código do template do modal. Talvez isso ajude (se bem que quando digito algo estático, ele exibe):

// js/directives/modal-dialog.html

<div class='ng-modal' ng-show='show'>
  <div class='ng-modal-overlay' ng-click='hideModal()'></div>
  <div class='ng-modal-dialog' ng-style='dialogStyle'>
    <div class='ng-modal-close' ng-click='hideModal()'>X</div>
    <div class='ng-modal-dialog-content'></div>
  </div>
</div>

Matheus e demais,

O botão de "solucionado" deve ter sido pressionado por engano. Não encontrei a solução ainda...

solução!

Airton você esta passando para seu modal o H3, foi definido em sua directiva a propriedade transclude, porém em seu modal-dialog.html você deve informar o element(tag) que deve ser transclude.

Nesse caso tente realizar a seguinte mudança em seu código:

<div class='ng-modal' ng-show='show'>
  <div class='ng-modal-overlay' ng-click='hideModal()'></div>
  <div class='ng-modal-dialog' ng-style='dialogStyle'>
    <div class='ng-modal-close' ng-click='hideModal()'>X</div>
    <div class='ng-modal-dialog-content' ng-transclude></div>
  </div>
</div>
`

Informando que a div .ng-modal-dialog-content deve manter o H3.

Matheus, resolvido! Falta de atenção... rs

Obrigado!

De nada Airton, sempre que precisar não deixe de criar suas dúvidas.