流星重助手设计模式

时间:2015-11-28 05:39:01

标签: meteor

因此,每次在模板中调用时,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;
    },
});

1 个答案:

答案 0 :(得分:0)

我成功使用的模式是在本地集合中缓存昂贵计算的结果。

MyLocalCache = new Mongo.Collection();

我喜欢使用原始对象在此集合中创建1:1的对象,因此我重用原始的_id以及不需要转换的任何键和值,然后使用转换后的值扩展对象