【发布时间】:2015-11-28 05:39:00
【问题描述】:
所以,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;
},
});
【问题讨论】:
-
这真的很复杂,把所有东西都分解并组织起来,这在一个助手中太多了,想想你如何能以不同的方式做到这一点
-
如果只想调用一次,可以使用
#with保留上下文。 -
我不认为这是真的。似乎每次我引用任何助手时,即使在
with语句中,助手都会重新处理。这准确吗?
标签: meteor