Solucionado (ver solução)
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.