【问题标题】:Meteor Heavy Helper Design PatternMeteor Heavy Helper 设计模式
【发布时间】: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


【解决方案1】:

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

MyLocalCache = new Mongo.Collection();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2014-03-13
    • 2017-01-06
    • 1970-01-01
    • 2016-11-16
    • 2016-08-23
    • 2015-08-09
    相关资源
    最近更新 更多