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

Problemas com ForEach no marko

Estou com problemas na hora de fazer o ForEach loop em um template do Marko. Eu baixei uma versão diferente do da aula para estudar e "me virar" caso precise ler a documentação oficial e mesmo seguindo a documentação oficial(https://markojs.com/docs/core-tags/#for) meu FOR não consegue iterar os elementos do meu Array que é passado pela minha rota GET "/" e me exibir uma resposta num template.

Eis meu setup:

package.json 
{
  "name": "marko-foreach",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "marko": "^4.18.10"
  }
}



Custom-express
require("marko/node-require").install();
const express = require("express");
var markoExpress = require("marko/express");


const app = express();

app.use(markoExpress());

const rotas = require("../app/rotas/rotas");

rotas(app);

module.exports = app;
Rotas.js

module.exports = function(app)
{
    app.get("/", function(req, resp)
    {
        console.log("MainPage");

        let colors = 
        [
            {
                index: 1, 
                color: "pink",
                name: "Pink"
            },
            {
                index: 2, 
                color: "blue",
                name: "Blue"
            },
            {
                index: 3, 
                color: "black",
                name: "Black"
            },
            {
                index: 4, 
                color: "green",
                name: "Green"
            }

        ];

        resp.marko(require("../View/window.marko"), colors);

    });

}
Template Marko

<html>
    <head>
        <meta charset="UTF-8">
        <title>Teste For Each</title>
    </head>

    <body>
        <ul>
            <for |color| in=data.colors>

                <li>`ColorIndex: ${color.index} - Color: ${color.color} - Name: ${color.name}`</li>

            </for>
        </ul>
    </body>
</html>
6 respostas

Murilo, bom dia!

Pelo que eu vi na documentação o for é uma "tag" e ele precisa ser aberto, mas você só fecha a tag, está faltando um "<" antes do for.

Espero ter ajudado e bons estudos!

Eu fechei a chave e não acontece nada. A única coisa que aparece no cmd após fazer a requisição pra raiz é meu log "MainPage". Após isso eu coloquei um

<h1> Teste </h1> 

antes do pra ver se era um erro no template que impedia ele de ser exibido, mas o h1 apareceu. Só o FOR que não.

Tanto que abri as ferramentas do navegador e vi o HTML gerado e o ul tá vazio:

<html>
<head>
    <meta charset="UTF-8"><title>Teste For Each</title>
</head>
<body style="">
    <h1 data-unsp-sanitized="clean"> Teste </h1> 
    <ul>
    </ul>
</body>


</html>

Murilo, bom tarde!

Você pode compartilhar com a gente o seu projeto no github para que possamos verificar e testar aqui?

Aguardo sua resposta e bons estudos!

Murilo, bom dia!

Olhei seu código e consegui chegar na solução! Começando pelo rotas.js, você está passando uma array de objetos, mas esse objeto deve ser passado como uma propriedade de outro objeto para o marko. A alteração ficou assim:

resp.marko(require("../views/marko/bookpage/BookList/List.marko"),{books: books});

Além disso dentro de List,marko foi necessário iterar pelas linhas e não usar a tag <for> eu realmente não sei dizer o que levou a não aparecer os itens visto que na documentação estava informando sobre a tag. Mas utilizar um for dentro do tr funcionou perfeitamente:

<tr for (book in data.books)>
                    <td>0</td>
                    <td>${book.title}</td>
                    <td>${book.price}</td>
                </tr>

Espero ter ajudado e bons estudos!

solução!

Sem dúvidas colocando o argumento de data assim em rotas.js

{books: books}

o .marko conseguiu receber a informação. Não se isso é um requerimento do Express ou do Marko.js.

Eu consegui usando a versão da documentação:

        <for|book| of=data.books >
                <tr>

                    <td>0</td>
                    <td>${book.title}</td>
                    <td>${book.price}</td>

                </tr>
            </for>

Quando a informação passada é um objetos só ex:

let dados = 
{
    Nome: "Murilo",
    Forum:"Duvidas",
    Categoria:"Node.js"
}

é usado o

<for |property, value| in data.dados><for/>

e quando foi meu caso, que eu tive vários objetos se usa o

<for|book| out data.books></for>

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