如何在 Meteor 中使用 #each 块实现最后一项的条件?

Posted

技术标签:

【中文标题】如何在 Meteor 中使用 #each 块实现最后一项的条件?【英文标题】:How do I implement condition for last item with #each block in Meteor? 【发布时间】:2014-05-27 10:01:57 【问题描述】:

我已将我的流星应用程序升级到 0.8.0,现在车把自定义助手已停止工作,助手允许我在最后一项附加到列表时更改行为,有谁知道我怎么能得到车把助手再次工作,或者我如何让这个功能与最新版本的流星一起工作,谢谢!

助手代码(Original Link)

Handlebars.registerHelper("foreach", function(arr, options)

  if(options.inverse && !arr.length)
    return options.inverse(this);

  return arr.map(function(item, index)
    item.$index = index;
    item.$first = index === 0;
    item.$last  = index === arr.length - 1;
    return options.fn(item);
  ).join('');
);

【问题讨论】:

【参考方案1】:

制作助手:

Template.registerHelper( 'isLastEach', ( arr, idx ) => 
    return arr.length == idx+1 ? true : false;
);

使用内置 @index 帮助器的示例:

#each yourArray             
    getNickname this#unless isLastEach yourArray @index ,/unless
/each

【讨论】:

【参考方案2】:

我几乎已经编写了自己的辅助函数,在它适用于我之前它可能不是最简单的解决方案(现在!)

eachLastItem = function (arr)
  if(arr.length > 0)
    if(typeof arr[0] == "object")
      var cnt = lastItem = 0;
      _.each(arr, function(obj)
        (cnt != arr.length - 1) ? lastItem = 0 : lastItem = 1;
        _.extend(arr[cnt], __lastItem: lastItem);
        cnt++; );
    else
      var cnt = lastItem = 0;
      var newArr = [];
      _.each(arr, function(str)
        (cnt != arr.length - 1) ? lastItem = 0 : lastItem = 1;
          var newObj = 
            str: str,
            __lastItem: lastItem 
          newArr.push(newObj);
        cnt++;
      );
      arr = newArr;
    
    return arr;
  else
    return null;
  

在模板中,我使用这个:

#each array
  <li>str</li>
  #if __lastItem
    !  
  else
  /if
/each

【讨论】:

我正在尝试使用它,但 #if __lastItem 没有为我返回数组的最后一个索引。 (每个索引都是一个对象)【参考方案3】:

Meteor 已将 Handlebars 命名空间迁移到 UI

UI.registerHelper("foreach", function(arr, options)
  return arr.map(function(item, index)
    item.$index = index;
    item.$first = index === 0;
    item.$last  = index === arr.length - 1;
    return options.fn(item);
  ).join('');
);

【讨论】:

嘿彭特!感谢您的回答,我现在有一个新问题,我无法将数组传递给帮助程序 #foreach foo/foreach 并且它给了我以下错误:“Deps 重新计算函数的异常: TypeError: 无法读取未定义的属性“逆” 啊,我明白了,我认为它比我最初想象的要复杂。另一种想法:您是否尝试过使用 jQuery 修改列表? Blaze 引擎与此更兼容

以上是关于如何在 Meteor 中使用 #each 块实现最后一项的条件?的主要内容,如果未能解决你的问题,请参考以下文章

在 Meteor 中的字符串数组上使用 Handlebars #each 进行迭代

Meteor js:使用#each 来迭代和渲染博客的多个 html 文件中的模板

在 Meteor 中使用 AutoForm 的可编辑表格

如何访问 Meteor 中选项的上下文?

如何在 Meteor Spacebars 模板中重复 N 次块?

Meteor.js 模板块中的“或”条件