【问题标题】:Iterating with Handlebars #each over an array of strings in Meteor在 Meteor 中的字符串数组上使用 Handlebars #each 进行迭代
【发布时间】:2013-12-30 14:22:54
【问题描述】:

我有一个 userId 字符串数组,并使用 {{#each}} 在模板中进行迭代。但是,#each 似乎想要一个对象并将每个字符串转换为和对象,如下所示:

String {0: "T", 1: "e", 2: "2", 3: "s", 4: "y", 5: "D", 6: "g", 7: "G", 8: "d", 9: "K", 10: "e", 11: "i", 12: "i", 13: "Q", 14: "S", 15: "i", 16: "W"} 

很烦人。任何想法如何避免这个问题?

谢谢

【问题讨论】:

  • 为什么不只遍历用户对象?
  • 问题在于 JavaScript 希望 this 成为一个对象。

标签: meteor handlebars.js


【解决方案1】:

例如,显示数组中的项目列表:

// input to template
const shopping_list = [
  'Apples',
  'Oranges',
  'Bread',
  'Peanut Butter'
];

// template.hbs
<ul>
  {{#each shopping_list}}
    <li>{{this}}</li>
  {{/each}}
</ul>

预期结果:

  • 苹果
  • 橙子
  • 面包
  • 花生酱

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并且

    this.toString()
    

    解决了这个问题,但作为 Meteor 的新手,我很好奇为什么会发生这种情况,以及这是否是问题的可接受解决方案。

    数据

    client {
        exampleProerty: value,
        projectManagers: [
            userId,
            userId 
        ],
        examleTwo: value
    }
    

    模板

    {{#each projectManagers}}
        {{> userTemplate}}
    {{/each}}
    

    模板助手

    Template.userTemplate.helpers({
    
    user: function() {
        var id = this.toString();
        var user = Meteor.users.findOne({_id: id});
        return user;
    }
    
    });
    

    否则,希望这对其他人有所帮助。

    【讨论】:

    • 这不是一个好的答案!您正在从视图中查询数据库,为您的存储添加了额外的依赖项。尝试在开始渲染之前获取所有信息。
    【解决方案3】:

    怎么样

    this.toString()
    

    可能比String(this) 更健壮。

    【讨论】:

      【解决方案4】:

      这似乎有效:

      String(this)
      

      不得不这样做实在是太不优雅了……

      【讨论】:

      • 另外,请记住,使用此构造函数,您不会得到“真正的”字符串,而是字符串对象。它们的行为大部分相同,但一些常见的假设被打破了。例如typeof "asdf" === "string",但typeof String("asdf") === "object"
      • 我刚刚检查了上述声明,在当前的 Firefox 中似乎是 typeof String("asdf") === "string"。所以这个问题取决于浏览器——调试起来更有趣。
      猜你喜欢
      • 2022-07-06
      • 2018-03-13
      • 2016-08-01
      • 2019-01-12
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      相关资源
      最近更新 更多