Tutorial: Master Detail com Transição no Spry
O Spry é uma framework para AJAX da Adobe.
Com ele é possível criar páginas dinâmicas incorporando dados de arquivos XML nos seus HTMLS sem a necessidade de refresh da mesma forma que acontece no Flex. O Spry também conta com uma API de efeitos bem grande que permite de uma maneira fácil usando JavaScript aplicar efeitos nos elementos HTML da sua página. O Spry possui outras facilidades como criar Tabs, Accordions e também possui ferramentas para validação de formulário (esse pode ser o meu próximo post).
Para visualizar a versão completa do exemplo clique aqui
Neste tutorial irei criar um simples exemplo de Master Detail usando Spry 1.4 com as informações do XML abaixo.
-
<?xml version="1.0" encoding="utf-8"?>
-
<estados>
-
<estado id="1">
-
<nome>São Paulo</nome>
-
<desc>
-
<![CDATA[
-
Lorem ipsum dolor...
-
]]>
-
</desc>
-
</estado>
-
<estado id="2">
-
<nome>Rio de Janeiro</nome>
-
<desc>
-
<![CDATA[
-
Ut sapien magna...
-
]]>
-
</desc>
-
</estado>
-
<estado id="3">
-
<nome>Paraná</nome>
-
<desc>
-
<![CDATA[
-
Nam et orci. Nulla...
-
]]>
-
</desc>
-
</estado>
-
</estados>
Antes de começar você precisa baixar a última versão do Spry clicando aqui.
O primeiro passo a seguir é incluir o Spry que é o arquivo SpryData.js (ele está na pasta includes do download feito) ele é o coração do Spry, também preciso incluir o arquivo Xpath.js pois o Spry utiliza o XPath parar procurar itens a partir da sua fonte de dados XML. XPath é uma linguagem baseada na árvore do arquivo XML e provê uma forma simples de selecionar os nós usando diversos critérios de busca. Para conhecer mais sobre XPath clique aqui.
Também iremos usar a bibliteca de efeitos do Spry que é a SpryEffects.js também na pasta includes do download.
-
<script type="text/javascript" src="includes/xpath.js"></script>
-
<script type="text/javascript" src="includes/SpryData.js"></script>
-
<script type="text/javascript" src="includes/SpryEffects.js"></script>
Após isso vamos criar o XML Data Set:
-
<script type="text/javascript">
-
var dsEstados = new Spry.Data.XMLDataSet("data/estados.xml", "estados/estado");
-
</script>
Agora vamos criar uma lista a partir do XML e a área de detalhe.
-
<div spry:region="dsEstados">
-
<div spry:state="loading">Carregando...</div>
-
<div spry:state="error">Erro na Captura dos Dados!</div>
-
<div spry:state="ready">
-
Estados:
-
<ul>
-
<li spry:repeat="dsEstados" onclick="fadeOutContentThenSetRow('{ds_RowID}');"><a href="javascript:;">{dsEstados::nome}</a></li>
-
</ul>
-
</div>
-
</div>
-
-
<div id="descricao" spry:detailregion="dsEstados">
-
<h3>{dsEstados::nome}</h3>
-
<span>
-
{dsEstados::desc}
-
</span>
-
</div>
Explicando:
- spry:region - Indica uma região dinâmica do data set
- spry:detailregion - é a região de detalhe para o data set indicado
-
spry:state - Indica qual o estado da requisição
- loading - esta div contêm o conteúdo que deve ser mostrado quando o Spry estiver carregando os dados
- error - esta div contêm o conteúdo que deve ser mostrado caso aconteça um erro no GET
- ready - quando tudo estiver ok esta div entra em ação
- spry:repeat - faz um loop dos resultados do data set
- onclick - chamo a função que irá executar a transição
- {dsEstados::nome} - Esta é a representação dos campos do dataset que aparecem na tela. Note que a variável é Bindable, ou seja ela fica sempre "escutando" o data set. existem 2 formas de utilização {dataset::nome_do_campo} ou {nome_do_campo} eu prefiro usar a primeira opção pra facilitar a manutenção no código.
O próximo passo é criarmos uma função que ira fazer a transição e adicionarmos um Observer na div.
-
<style type="text/css">
-
#descricao {
-
opacity: 0;
-
filter: alpha(opacity=0);
-
}
-
</style>
-
-
<script type="text/javascript">
-
var dsEstados = new Spry.Data.XMLDataSet("data/estados.xml", "estados/estado");
-
-
function fadeInContent(notificationType, notifier, data) {
-
if (notificationType != "onPostUpdate")
-
return;
-
Spry.Effect.AppearFade('descricao', { to: 100, from: 0, duration: 500 });
-
}
-
-
Spry.Data.Region.addObserver('descricao', fadeInContent);
-
</script>
Explicando:
- fadeInContent - função Observer que irá fazer um "fade" escondendo o conteúdo da div sempre que o detailRegion for atualizado. Obs: Observe que eu tenho um style definindo opacidade 0 (zero) para minha div. Isto serve para previnir bugs entre navegadores na hora do Fade inicial.
- Spry.Effect.AppearFade - Função que executa o efeito de Fade.
- Spry.Data.Region.addObserver - onde eu indico que a função observer "fadeInContent" está relacionada a minha div "descricao"
Agora só nos resta criar a função de fade-out:
-
<style type="text/css">
-
#descricao {
-
opacity: 0;
-
filter: alpha(opacity=0);
-
}
-
</style>
-
-
<script type="text/javascript">
-
var dsEstados = new Spry.Data.XMLDataSet("data/estados.xml", "estados/estado");
-
-
function fadeInContent(notificationType, notifier, data) {
-
if (notificationType != "onPostUpdate")
-
return;
-
Spry.Effect.AppearFade('descricao', { to: 100, from: 0, duration: 500 });
-
}
-
-
Spry.Data.Region.addObserver('descricao', fadeInContent);
-
-
function fadeOutContentThenSetRow(rowID) {
-
Spry.Effect.AppearFade('descricao', { to: 0, from: 100, duration: 1000, finish: function() {
-
dsEstados.setCurrentRow(rowID);
-
}});
-
}
-
</script>
Explicando:
- fadeOutContentThenSetRow - Irá mostrar o conteúdo da div quando algum ítem da lista é clicado
- setCurrentRow - Defino qual a linha atual no DataSet
O código final ficará assim:
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
<title>Spry - Básico</title>
-
-
<script type="text/javascript" src="includes/xpath.js"></script>
-
<script type="text/javascript" src="includes/SpryData.js"></script>
-
<script type="text/javascript" src="includes/SpryEffects.js"></script>
-
<script type="text/javascript">
-
var dsEstados = new Spry.Data.XMLDataSet("data/estados.xml", "estados/estado");
-
-
function fadeInContent(notificationType, notifier, data) {
-
if (notificationType != "onPostUpdate")
-
return;
-
Spry.Effect.AppearFade('descricao', { to: 100, from: 0, duration: 500 });
-
}
-
-
Spry.Data.Region.addObserver('descricao', fadeInContent);
-
-
function fadeOutContentThenSetRow(rowID) {
-
Spry.Effect.AppearFade('descricao', { to: 0, from: 100, duration: 500, finish: function() {
-
dsEstados.setCurrentRow(rowID);
-
}});
-
}
-
</script>
-
-
<style type="text/css">
-
#descricao {
-
opacity: 0;
-
filter: alpha(opacity=0);
-
}
-
span {
-
font-size:10px;
-
font-family:Verdana, Arial, Helvetica, sans-serif;
-
}
-
</style>
-
-
</head>
-
<body>
-
-
<div spry:region="dsEstados">
-
<div spry:state="loading">Carregando...</div>
-
<div spry:state="error">Erro na Captura dos Dados!</div>
-
<div spry:state="ready">
-
Estados:
-
<ul>
-
<li spry:repeat="dsEstados" onclick="fadeOutContentThenSetRow('{ds_RowID}');"><a href="javascript:;">{dsEstados::nome}</a></li>
-
</ul>
-
</div>
-
</div>
-
-
<div id="descricao" spry:detailregion="dsEstados">
-
<h3>{dsEstados::nome}</h3>
-
<span>
-
{dsEstados::desc}
-
</span>
-
</div>
-
-
</body>
-
</html>
Bom é isso aí um "SIMPLES" tutorial de como fazer um master detail no Spry usando transições.
Mais informações sobre o Spry você encontra em:
3 comentários para “Tutorial: Master Detail com Transição no Spry”
Fala Diogo, tudo bem?
Parabéns pela informação e acima de tudo pela qualidade dela. Excelente “start”.
[]’s,
Sem palavras
Aí Diogo, será que em um futuro DW (9 ou 10 quem sabe) o Spry não poderia vir atrelado!?!
Seria uma ótima idéia, não acha?
A Adobe tem a faca e o queijo na mão para dominar uma fatia (mais) legal (ainda) da web
[]’s
Para quem é um iniciante, o tutorial parece confuso, pois este passo a passo saltou passos importantes. Quando o autor informa: “Pra começar você precisa ter os seguintes scripts na sua página:”, por exemplo, a pergunta natural para o iniciante é: “Mas onde arrumo este script? Onde o Spry entra aí?”. Na verdade não se trata de um tutorial, mas de como fazer um master detail no Spry usando transições, sem fazer força e sem precisar entender como. Espero que minha crítica tenha sido construtiva, pois é este o objetivo.
Adicionar comentário
Fala Diogo, tudo bem?
Parabéns pela informação e acima de tudo pela qualidade dela. Excelente “start”.
[]’s,
Sem palavras
Aí Diogo, será que em um futuro DW (9 ou 10 quem sabe) o Spry não poderia vir atrelado!?!
Seria uma ótima idéia, não acha?
A Adobe tem a faca e o queijo na mão para dominar uma fatia (mais) legal (ainda) da web
[]’s
Para quem é um iniciante, o tutorial parece confuso, pois este passo a passo saltou passos importantes. Quando o autor informa: “Pra começar você precisa ter os seguintes scripts na sua página:”, por exemplo, a pergunta natural para o iniciante é: “Mas onde arrumo este script? Onde o Spry entra aí?”. Na verdade não se trata de um tutorial, mas de como fazer um master detail no Spry usando transições, sem fazer força e sem precisar entender como. Espero que minha crítica tenha sido construtiva, pois é este o objetivo.

