我有一个基于异步信息的模板,所以我使用Session
数据,以便在数据到达时反应性地呈现视图。类似的东西:
item.html:
<template name="item">
{{#with item}}
{{itemInformation.name}}
{{/with}}
</template>
item.js
Template.item.created = function () {
getItemData(this.data.item.id, function(data) {
Session.set("itemInformation", data);
});
}
Template.item.helpers({
itemInformation: function() {
return Session.get("itemInformation");
}
});
如果我有一个项目模板处于活动状态,这种方法似乎工作正常。但是如果我在#each
循环中使用这种方法,我就会在会话数据上发生冲突。
Session
数据吗?#each
循环中的异步数据重新呈现视图的正确方法是什么?答案 0 :(得分:1)
self.localSession = new ReactiveDict ()
)中创建ReactiveDict(https://atmospherejs.com/meteor/reactive-dict - Session实际上在其实现中使用它),并使用它而不是Session(self.localSession.set('itemInformation', data)
)。
您可以通过以下方式在模板助手中访问它:Template.instance().localSession.get('itemInformation')
。如果它只是您要存储在字典中的一个项目,您也可以以相同的方式使用单个ReactiveVar(https://atmospherejs.com/meteor/reactive-var)。
您的代码:
Template.item.created = function () {
var self = this;
self.localSession = new ReactiveDict ();
getItemData(self.data.item.id}, function(data) {
self.localSession.set("itemInformation", data);
});
}
Template.item.helpers({
itemInformation: function() {
return Template.instance().localSession.get("itemInformation");
}
});
答案 1 :(得分:1)
Session
是global named ReactiveDict
。因为它是全球性的,所以你可能不希望它太混乱。
为什么甚至使用ReactiveDict
?如果您要为每个模板仅存储一个项目,那么ReactiveVar
是明显的方法!另外,ReactiveVar
可以包含任何,而ReactiveDict
instances may only contain EJSON-able values。
因此,
Template.item.created = function () {
getItemData(this.data.item.id, data => {
this.item = new ReactiveVar(data);
});
}
Template.item.helpers({
itemInformation: () => Template.instance().item
});
请注意,每个模板都会根据自己的set
实例的后续ReactiveVar
进行更新。如果您希望定期使用getItemData
更新它们,则没有多少选项
因为它是一种异步方法,所以你运气不好。您最好的选择是在回调中使用Meteor.setInterval
和item.set()
生成的数据定期轮询数据。我为同步getter做过类似here的事情,你必须调整实现。
如果您使用上述的轮询策略,请不要忘记模板的onDestroyed
回调中的Meteor.clearInterval
。