【问题标题】:How do I populate a bootstrap grid system using handlebars for each command in Meteor.js?如何使用 Meteor.js 中的每个命令的把手来填充引导网格系统?
【发布时间】:2013-09-11 12:46:12
【问题描述】:

我正在尝试每行显示 3 个项目。我的模板如下所示:(已更新)

 <template name="projectList">
   {{breakTimeReset}}
   <div class=row>          
  {{#each projects}}

    {{> projectItem}}

        {{#if breakTime}}
        </div>
        <div class=row>
        {{/if}}

   {{/each}}
   </div>
</template>

如您所见,我为数据库中的每个项目输出了 projectItem。我想输出它们,所以每 3 个项目都包含在一个

这是我的 js 助手

Template.projectList.helpers({
    projects: function() {
        return Projects.find();
    },
    breakTimeReset: function() {
        Template.projectList.doCount = 0;
    },
    breakTime: function () {
        count = Template.projectList.doCount + 1;
        console.log(count);
        Template.projectList.doCount = count;

        if (count % 3 == 0) {
            console.log("Started break");
            return true;
        }
        else
            return false;
    }
});

我的问题是如何设置它,以便每行有 3 个项目,然后它知道在每 3 个项目之后插入一个新的行 div?我目前的设置方式导致了非常时髦的结果,因为它不可靠,因为新的 div 将被插入到项目之前。

在此处查看结果:http://testprojectapp.meteor.com

您会看到第一行显示正常,但之后我得到了一些时髦的结果。如果您通过查看页面源代码检查 DOM,您会发现与我的代码不匹配,这很奇怪。

如果这是一个令人困惑的问题,请告诉我。谢谢!

【问题讨论】:

    标签: html css twitter-bootstrap meteor handlebars.js


    【解决方案1】:

    您也可以使用纯 CSS 来做到这一点。 Foundation Framework 有一个网格系统,您需要在网格元素中定义列,而不是在子元素本身中定义列,并且有人对其进行了调整以与引导程序一起使用。这意味着您可以简单地添加越来越多的元素,然后网格会对其进行布局。

    https://github.com/JohnnyTheTank/bootstrap-block-grid

    <div class="block-grid-xs-2 block-grid-sm-3 block-grid-md-4">
        <div>
            Content 1
        </div>
        <div>
            Content 2
        </div>
        <div>
            Content 3
        </div>
        <div>
            Content 4
        </div>
        <div>
            Content 5
        </div>
        <div>
            Content 6
        </div>
    </div>
    

    【讨论】:

      【解决方案2】:

      更新:失败,因为模板引擎很有帮助,并且不会让您拥有跨越模板的标签。即使您尝试仅注入文本,它也会平衡每一个。如果你需要它很好,我不是粉丝。

      上一个:

      哦,近点卡在他的枪上,我错了! Handlebars 解析每个模板并“修复”它,因此标签的数量是偶数。编辑以反映这一点。

      模板

      <template name='sureties'>
      {{breakTimeReset}}
      
      {{#each allSureties }}
      
        {{name}}
      
        {{{breakTime}}}
      
      {{/each}}
      </template>
      

      一些辅助函数

      Template.sureties.breakTimeReset = ->
        Template.sureties.docCount = 0
        ''
      Template.sureties.breakTime = ->
        count = Template.sureties.docCount + 1 or 0
        console.log  count
        Template.sureties.docCount = count
        if count % 3 is 0
          return "</div><div class="">
        else
          return ""
      

      【讨论】:

      • 我一直在尝试这样的事情,但我无法让它工作。我用我一直在尝试做的事情更新了上面的代码。
      • 尝试 if ((count != 0) && (count % 3 == 2)) { 但你有正确关闭它的问题(不是双重关闭它)。这就是为什么我更喜欢将休息视为关闭和打开的原因。如果你最终得到一个空行,没问题。我的代码按原样工作,只有两个功能。考虑一下。
      • 我对您模板中的某些内容感到困惑。我假设您代码中的 {{name}} 变量等同于我的项目。首先,第一个 {{name}} 不会进入 ,因为您只是在之后调用它。其次,count = Template.sureties.docCount + 1 或 0 是什么意思。为什么是“或 0”部分?最后,您的意思是如果 count % 3 为 0 返回 true?谢谢我真的很感谢你的帮助,我觉得我很接近了!
      • 所以对于第一个 {{name}} 我想你可以在顶部添加一个 。所以你可以忽略这个问题。
      • 我更新了我的代码以完全按照您在模板中显示的方式进行操作。我在我更新的问题中展示了这一点。我还把它部署到了一个流星测试服务器上:testprojectapp.meteor.com 结果很奇怪,不知道为什么?你能告诉?我很感激!
      【解决方案3】:

      您可以在呈现数据之前对其进行分组:

      Template.projectList.helpers({
          projects: function () {
              all = Projects.find({}).fetch();
              chunks = [];
              size = 3
              while (all.length > 3) {
                  chunks.push({ row: all.slice(0, 3)});
                  all = all.slice(3);
              }
              chunks.push({row: all});
              return chunks;
          },
          breakTimeReset: function () {
              Template.projectList.doCount = 0;
          },
          breakTime: function () {
              count = Template.projectList.doCount + 1;
              console.log(count);
              Template.projectList.doCount = count;
      
              if (count % 3 == 0)
                  return "</div><!-- why? --><div class='row'>"
              else
                  return ""
          }
      });
      
      <template name="projectList">
        {{breakTimeReset}}
        {{#each projects}}
          {{> projectRow }}
        {{/each}}
      </template>
      
      <template name='projectRow'>
        <div class='row span12'>
          {{#each row }}
            {{> projectItem}}
          {{/each}}
        </div>
      </template>
      
      <template name="projectItem">
        <div class="span4">
          <h3><a href="{{projectPagePath this}}"> {{title}} </a></h3>
          <p> {{subtitle}} </p>
          <p> {{description}} </p>
          <p><img src="{{image}}"/></p>
          <p> {{openPositions}} </p>
        </div>
      </template>
      

      对不起,我错过了很多次,近点!

      【讨论】:

      • 这对我来说太美了!它像魔术一样工作。非常感谢您的解决方案!你刚刚让我的夜晚,现在我可以睡个好觉了。我欠你一个:)
      • 对于车把如何渲染模板真是太疯狂了。如果有一个命令可以关闭它会很好。
      • 我也是这样;很高兴为您提供帮助
      猜你喜欢
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2018-07-03
      • 2017-11-29
      • 2016-03-11
      相关资源
      最近更新 更多