因此,每次在模板中调用时,meteor都会重新运行辅助代码,对吧?我的问题是我有一个重型助手返回一个大对象。我迭代这些对象的列表,然后遍历一些嵌套的对象,这导致了一个非常大的滞后。
那么,是否有任何设计模式可以防止每次都召回整个帮助者?或者我只需要打破我的对象?
Template.deliveries.helpers({
current_delivery: function() {
var delivery_id = Template.instance().data.current_delivery_id;
var delivery = Deliveries.findOne({'_id': delivery_id});
var project = Projects.findOne({'_id':Session.get('current_project_id')});
var secondary_profile_names = [];
if (Session.get('delivery_include_secondaries')) {
for (var n in project.delivery_profiles) {
if (project.delivery_profiles[n].name === delivery.delivery_profile) {
if (project.delivery_profiles[n].secondary_deliverables) {
secondary_profile_names = project.delivery_profiles[n].secondary_deliverables;
}
break;
}
}
}
$("#delivery-profile").val(delivery.delivery_profile);
var elements = $.map(delivery.elements, function(id, idx) {
i_el = InternalElements.findOne({'_id': id});
i_el.source_element = SourceElements.findOne({'_id':i_el.source_element});
if (secondary_profile_names) {
i_el.secondary_elements = InternalElements.find({
'source_element':i_el.source_element._id,
'name':{'$in': secondary_profile_names},
"$or": [{'is_primary':false}, {'is_primary': {'$exists':false}}]
},{
'sort':{'version':-1},
'limit':1
}).fetch();
} else {
i_el.secondary_elements = [];
}
return i_el;
});
delivery.elements = elements.sort(function(a,b) { return (a.shot_name > b.shot_name) - (a.shot_name < b.shot_name); });
return delivery;
},
});
答案 0 :(得分:0)
我成功使用的模式是在本地集合中缓存昂贵计算的结果。
MyLocalCache = new Mongo.Collection();
我喜欢使用原始对象在此集合中创建1:1的对象,因此我重用原始的_id
以及不需要转换的任何键和值,然后使用转换后的值扩展对象