Meteor:#each循环中的反应性问题

时间:2014-08-05 08:36:32

标签: meteor spacebars

不幸的是,我不允许发布图片,所以这使得显示手头的问题变得有点困难。所以我将在这里描述一下。 在我最后的Meteor on screen display中,我有一个包含行项目的发票。行项目和所有工作完美,并按预期显示。 我想做的是,在屏幕上打印4个项目后,在每个循环中“中断”,然后执行其他操作(计算和打印小计)。我无法让它工作,因为我为此创建的会话var似乎没有在每个行项目上被动地改变。相反,它似乎保留了完整的#each循环中的最后一个值。

请注意,在那里有一个listindex变量,可以在#each循环中的每个行项目上完美地重新建立从1到2,3和4。因此,listindex变量 在#each循环中反应性地工作。

与此同时,我在那里引入了一个会话var,在第4行的项目上应该是“true”,在所有其他情况下都应该是“false”。在“真实”它应该在那里打印“onderbreking”。但是,会话var 始终给出“true”和(因此)始终打印“onderbreking”。当然,这不是我打算如何工作的。

我不明白为什么listindex有效,会话var没有?

这是我的javascript。该模板名为“layout6.html”:

  Template.layout6.helpers({
        // Bereken de index in de #each loop
        listIndex: function() {
          currentIndex += 1;
          if(currentIndex == 4) {
            Session.set('sessionPageBreak1', true);
          }
          if(currentIndex != 4) {
            Session.set('sessionPageBreak1', false);
          }
        return currentIndex;
        },            
  });    

 Template.layout6.SessionPageBreak1 = function() {
            // Voeg de waarde van de sessie variabele toe aan de template
            var data = Session.get('sessionPageBreak1');
            return data;
 };

会话var最初在此处设置:

  // Session var for layoutcounter
  Session.setDefault('sessionPageBreak1', false);
  Session.setDefault('sessionPageBreak2', false); 
  Session.setDefault('sessionPageBreak3', false);  
  var currentIndex = 0.0;

最后,这是layout6.html上的html:

{{#each factuur6.lineItems}}
  {{listIndex}}
  {{SessionPageBreak1}}
{{#if SessionPageBreak1}}
<div><p>onderbreking</p></div>
{{/if}}

当然,还有一个{{/ each}}语句,但是其中有很多代码与这个问题不太相关,所以我没有把它放在这里。

我希望我包括所有内容,如果没有,你们无疑会告诉我。

问题是:我做错了什么,以便会话var在#each循环中没有被动地改变?

1 个答案:

答案 0 :(得分:2)

这不是使用Session变量的正确方法。会话变量用于全局应用程序状态,而不是用于通过单个计算存储中间值。一般规则是模板和模板助手不应有副作用(如设置会话变量)。

我会采取不同的方法。定义帮助器:

lineItemsWithIndex: function () {
  return _.map(this.factuur6.lineItems, function (item, index) {
    var newItem = _.clone(item);
    newItem.index = index;
    return newItem;
  });
}

此函数返回this.factuur6.lineItems的副本,但每个对象都添加了index属性。例如,如果lineItems列表为[{name: "foo"}, {name: "bar"}, {name: "baz"}],则返回[{name: "foo", index: 0}, {name: "bar", index: 1}, {name: "baz", index: 2}]。原始列表保持不变。如果factuur6是帮助者而不是字段,则使用_.map(Template.layout6.factuur6().lineItems ...

然后在模板中迭代:

{{#each lineItemsWithIndex}}
  {{index}}
  {{pageBreak1}}
  {{#if pageBreak1}}
    <div><p>onderbreking</p></div>
  {{/if}}
{{/each}}

其中pageBreak1是助手function () {return this.index == 3;}(3而不是4,因为这些索引是从0开始的)。由于我们为每个对象添加了索引,现在可以在帮助程序中访问它。

这假设您的订单项还没有名为index的字段。