【发布时间】:2014-11-02 05:29:46
【问题描述】:
考虑这个假设的例子。 html:
{{#each items}}
{{>item}}
{{/each}}
Price = {{itemTotals.totalPrice}}
Qty = {{itemTotals.totalQty}}
Js:
Template.cart.items = function () {
var items = Items.find();
var cartTotals = [];
items.forEach(function(item){
..somecode...
cartTotals.price += item.price;
cartTotals.qty += 1;
});
return items;
}
当然,我们需要一个函数“itemTotals”。如果我们做 price = {{items.itemTotals.totalPrice}} 和数量相同,我们必须遍历项目 3 次。我尝试将总数存储为反应变量,如下所示,但无法使其工作:
Template.cart.rendered = function () {
this.totals = new ReactiveVar([]);
}
Template.cart.items = function () {
var items = Items.find();
var cartTotals = [];
items.forEach(function(item){
...
});
this.totals.set(cartTotals);
return items;
}
Template.cart.totals = function () {
return this.totals.get();
}
我想 1) 了解为什么没有发生反应 2) 找出是否有办法让模板函数等待另一个 - 这比从反应变量加载和重新加载值更有效
【问题讨论】:
-
尝试在
items和totals助手中将this.totals替换为Template.instance().totals。还记得在items助手中return items。 -
Template.instance()似乎没有什么不同。对于两个 get 和 set 方法,您最终会遇到“无法调用方法 get/set of undefined”错误。我很困惑为什么会这样,因为 render() 方法发生在这些调用中的任何一个之前 - 并且在方法中放置一个 console.log 证实了这一点。我应该提一下,使用 Session 变量或 deps 会导致类似的结果,所以我认为我的做法并不正确。
标签: meteor