不幸的是,我不允许发布图片,所以这使得显示手头的问题变得有点困难。所以我将在这里描述一下。 在我最后的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循环中没有被动地改变?
答案 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
的字段。