Pesquisa de site

javascript - Acessar os nomes das propriedades de um objeto em um template Blaze


Diga que eu tenho um ajudante que se parece com isto:

Template.profile.helpers({
  info: {
    Name: 'Bob Dinkleberg',
    Age: 45,
    Location: 'Earth, Milky Way'
  }
});

Eu quero colocar essas informações em um <ul>. Aqui está algum pseudo-código:

<template name="profile>
  <ul>
    {{#each}}
      <li> {{key}}: {{property}} </li>
    {{/each}}
  </ul>
</template>

Perdoe-me se isso é trivial, sou novo no Meteor e Blaze, e não consegui encontrar uma solução online.

Resposta #1

Se você quiser percorrer as propriedades e valores de um objeto como você solicitou, você pode fazer isso de forma genérica assim:

Template.content.onCreated(function() {
  this.properties = new ReactiveVar({
    Name: 'Bob Dinkleberg',
    Age: 45,
    Location: 'Earth, Milky Way'
  });
});

Template.content.helpers({
  keys: function () {
    return Object.keys(Template.instance().properties.get());
  },
  key_value_pair: function() {
    return { key: this, value: Template.instance().properties.get()[this] };
  }
});

e com este modelo

<body>
  <h1>Property Loop</h1>
  <ul>
  {{> content}}
  </ul>
</body>

<template name="content">
  {{#each keys}}
    {{> property key_value_pair }}
  {{/each}}
</template>

<template name="property">
  <li>{{key}}: {{value}}</li>
</template>

Eu preparei este MeteorPad para você, que é um exemplo em execução:

http://meteorpad.com/pad/24MGwbuMNCcXCC7EW/PropertyLoop

Valeu, Tom

P.S.: Não é necessário criar o objeto como um ReactiveVar se seus valores nunca mudarem. Mas fazendo isso como um ReactiveVar, o formulário também é atualizado reativamente, quando o conteúdo do objeto mudar.

Resposta #2

Isso será útil:

http://meteorcapture.com/spacebars/

Você quer usar {{#with}}.

<template name="profile">
  <ul>
    {{#with info}}
      <li>{{Name}}</li>
      <li>{{Age}}</li>
      <li>{{Location}}</li>
    {{/with}}
  </ul>
</template>

Enquanto seu código auxiliar está correto:

Template.profile.helpers({
  info: {
    Name: 'Bob Dinkleberg',
    Age: 45,
    Location: 'Earth, Milky Way'
  }
});

Pessoalmente, gosto de criar o hábito de mapear o nome do ajudante para uma função que retorna algo.

Template.profile.helpers({

  info: function(){

    return {
      Name: 'Bob Dinkleberg',
      Age: 45,
      Location: 'Earth, Milky Way'
    };

  }

});

EDITAR

Template.content.helpers({

  info: function(){
    var obj = {
      Name: 'Bob Dinkleberg',
      Age: 45,
      Location: 'Earth, Milky Way'
    };
    var arrayOfObjects = [];

    // creating an array of objects
    for (key in obj){
      arrayOfObjects.push({key: key, value: obj[key]});
    };
    console.log("This is the array of objects: ", arrayOfObjects);
    return arrayOfObjects;
  },

});

HTML :

{{#each info}}
    {{value}}
{{/each}}