如何使用 DustJS 动态显示 JSON 值

How to display JSON values dynamically using DustJS

var data = {
  response: [
    { name: "Moe", age:  37,salary: 10000 },
    { name: "James", age:  31, salary: 12000 },
    { name: "Jan", age:  28, salary: 9000 },
    { name: "David", age:  29, salary:8500 }
  ]
};

var gridDef = {
  "data":data,
  "columnDef":[
    { "field":"name", "columnName":"Name" },
    { "field":"Age", "columnName":"Age" },
    { "field":"Salary", "columnName":"salary" }
  ]
}

var source = '<table id="dustGoals"> ' +
    '<thead> <tr> ' +
    '{#columnDef}' +
    '<th style="border:1px;background-color: cyan">{columnName}</th> ' +
    '{/columnDef} ' +
    '</tr> </thead> ' +
    '<tbody> {#data.response}' +
    '<tr>' +
      '{#columnDef}' +
        '<td>{eval(response[field])}</td>' + //field is "name","Age","salary" key and want to display values of response JSON array above.
      '{/columnDef}' +
    ' </tr> '+
    '</tbody>{/data.response}'+
    '</table>';

var compiled = dust.compile(source,"goalTemplate");
dust.loadSource(compiled);
dust.render("goalTemplate", gridDef,
function(err, out) {
  document.getElementById('dustPlaceholder').innerHTML = out;
});

我需要动态显示 data.response 值。如何使用 columnDef 中每个对象的 field 属性 来显示 response 中的关联值?

在此示例中,columnDef 将使用 fieldnameagesalary 循环三次。

此数据的格式对于 Dust 来说并不理想。因为 Dust 不会递归地渲染模板,所以您将不得不进行比其他情况下需要更多的迭代。理想的答案是重新格式化您的服务器发送的数据,以便所有相关字段都是同一对象的一部分。

例如,由于您要求动态显示字段,服务器数据实际上应该看起来更像:

[
  [ "Moe", 37, 10000 ],
  [ "James", 31, 12000 ],
  ...
]

然后您就可以遍历数组了。

如果你不能改变服务器的数据格式,你需要写一个context helper来扩展Dust。这是一种可能的解决方案,但您可以用多种方式编写它。

{
  fieldsFromColumnDef: function(chunk, context, bodies, params) {
    // Grab the fields we want to display
    var fields = context.resolve(params.columnDef).map(function(field) {
      return field.field;
    });

    // The current context will be a single item from results
    var row = context.current();

    // For each field name, render the body of the helper once with
    // the correct data
    fields.forEach(function(field) {
      chunk = chunk.render(bodies.block, context.push(row[field]));
    });

    return chunk;
  }
}

您的模板将如下所示:

{#data.response}
  <tr>
    {#fieldsFromColumnDef columnDef=columnDef}
      <td>{.}</td> <!-- the dot means "current context" -->
    {/fieldsFromColumnDef}
  </tr>
{/data.response}

最后,注意-- 您的 columnDef 示例是错误的!大写与字段名称不匹配,因此您会得到不正确的结果。一旦你解决了这个例子的问题,但我没有改变你的问题,因为那会改变它的意图。