TextArea中的For-Each循环

时间:2014-01-31 15:47:22

标签: javascript meteor handlebars.js

当我尝试在纯HTML文本区域中使用Handlebars ForEach循环时,我遇到了一些意想不到的行为。

首先让我告诉你我的代码:

我的template.html:

<template name="test">
  <textarea>
    {{#each array}}
      {{this}}
    {{/each}}
  </textarea>
</template>

我的template.js:

Template.test.array = function(){
    return ["String1", "String2", "String3"];
}

问题:

我实际上期望一些看起来像这样的输出:

String1 
String2 
String3

相反,我得到了这个:

<!--data:46XrgsL9aX8aCa3Ek-->
<!--data:tu6FiCxRraSLoh2w9-->
<!--data:5h3PkyB66dHw4zrWF-->

作为一种解决方法,我使用了Handlebars助手并使用jQuery操纵了textarea的值,这非常有效。

我仍想对此案做一些澄清:

  1. 为什么我没有得到预期的输出?如果我在textarea之外使用循环,它会正确打印字符串。
  2. 这些字符串是什么? JavaScript的内部对象ID等?
  3. 感谢每一个小小的帮助!

2 个答案:

答案 0 :(得分:1)

这些字符串看起来像Spark landmarks。这很奇怪,但可能会在下一个Meteor版本中重写渲染引擎时修复。

这可能与字符串文字作为上下文传递给帮助程序时的问题有关;它变成了一个对象。

  

https://github.com/meteor/meteor/issues/1447

返回字符串文字的一种方法是编写帮助程序。而不是{{this}},请写{{printString}},然后定义

Template.test.printString = function() { return "" + this; }

答案 1 :(得分:0)

嗯,这应该有效!如果在安德鲁的建议之后仍然没有,请尝试以下方法:

1)将数据移出帮助者:

var array = ["String1", "String2", "String3"];
Template.test.array = function(){
  return array;
};

2)将数据条目包装在对象中,作为解决方法:

Template.test.array = function(){
  return [{label: "String1"}, {label: "String2"}, {label: "String3"}];
};

{{#each array}}
  {{label}}
{{/each}}