Javascript Meteor#每个和会话数据
我有一个基于异步信息的模板,因此我使用Javascript Meteor#每个和会话数据,javascript,meteor,Javascript,Meteor,我有一个基于异步信息的模板,因此我使用会话数据,以便在数据到达时反应性地呈现视图。比如: item.html: <template name="item"> {{#with item}} {{itemInformation.name}} {{/with}} </template> 如果有一个项目模板处于活动状态,这种方法似乎可以很好地工作。但是,如果我在#每个循环中使用这种方法,我会遇到会话数据上的冲突 是否有我可以使用的“本地”会话数据
会话
数据,以便在数据到达时反应性地呈现视图。比如:
item.html:
<template name="item">
{{#with item}}
{{itemInformation.name}}
{{/with}}
</template>
如果有一个项目模板处于活动状态,这种方法似乎可以很好地工作。但是,如果我在#每个循环中使用这种方法,我会遇到会话数据上的冲突
是否有我可以使用的“本地”会话
数据
当基于#每个循环中的异步数据时,重新渲染视图的正确方法是什么
您可以在onCreated模板回调(self.localSession=new ReactiveDict()
)中创建一个ReactiveDict(-Session实际上在其实现中使用它),并使用它代替Session(self.localSession.set('itemminformation',data)
)。
您可以通过以下方式在模板帮助器中访问它:template.instance().localSession.get('itemInformation')
如果它只是一个要存储在字典中的项,那么也可以以相同的方式使用single-ReactiveVar()
正如您所注意到的,您需要在一些反应源中设置异步内容,您可以使用我上面描述的构造
您的代码:
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");
}
});
在希望在应用程序的各个部分之间共享数据时使用。因为它是一个全球性的,你可能不想把它弄得太乱
为什么还要使用ReactiveDict
?如果您打算每个模板只存储一个项目,那么a是一个明显的方法!另外,ReactiveVar
可以包含任何内容,而
因此,
请注意,每个模板将根据其自己的ReactiveVar
实例的后续set
更新。如果您希望使用getItemData
定期更新它们,您没有太多选项。
因为这是一个异步方法,所以你就不走运了。最好的方法是定期轮询回调中的数据,并item.set()
。我已经为同步getter做了类似的事情,您必须调整实现
如果您使用上述轮询策略,请不要忘记在模板的onestroyed
回调中调用。这非常有效,而且比我尝试的滥用SessionData的方法要好得多。有关此问题的完整讨论,请参阅。
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");
}
});
Template.item.created = function () {
getItemData(this.data.item.id, data => {
this.item = new ReactiveVar(data);
});
}
Template.item.helpers({
itemInformation: () => Template.instance().item
});