如果其中一个订阅的集合发生变化,可以重新呈现整个铁路:路由器路由吗?

时间:2015-02-13 14:44:25

标签: meteor iron-router

模板助手显然可以提供被动数据,但Collection变换不会重新运行变更。那么是否可以触发完整的路线重新渲染?或完整的模板重新渲染?

这里是帮助者,我希望完全刷新变换:

Template.productEdit.helpers({
    'locationsInventory': function(_productId) {
        return Inventory.find({productId: _productId}, {transform: function(doc) {
                    doc.name = Locations.findOne(doc.locationId).name;
                    return doc; // Transform is Non-reactive
                }
            }
        );
    }
});

你可以看到我正在加入一个名字'从另一个集合到带有转换的doc。但是当然这是非反应性的,所以如果可以完全重新触发路线渲染,如果“地点”和“#39;收藏改变了?

3 个答案:

答案 0 :(得分:1)

也许使用Tracker.autorun

   Template.productEdit.helpers({
    'locationsInventory': function(_productId) {
             Tracker.autorun(function(){
                     return Inventory.find({productId: _productId}, {transform: function(doc) {
                    doc.name = Locations.findOne(doc.locationId).name;
                    return doc; // Transform is Non-reactive
                }
               })
            }
        );
    }
});

observe.

Template.productEdit.helpers({
    'locationsInventory': function(_productId) {
        return Inventory.find({productId: _productId}, {transform: function(doc) {
                 var query = Locations.findOne(doc.locationId).name;
                    query.find().observeChanges({
                     added: function(id, doc) {
                         return doc;
                        }
                    });
                }
            }
        );
    }
});

答案 1 :(得分:1)

我会做这样的事情(未经测试):

Template.productEdit.helpers({
    'locationsInventory': function(_productId) {
        inventory = Inventory.find({productId: _productId}).map(function(doc) {
           docs = Locations.find(doc.locationId).fetch()
           return docs[0].name
        });
    }
});

我使用fetch()因为它是被动的(而findOne()不是)。 map()也是反应性的,所以如果要么改变,依赖关系将重新运行。

答案 2 :(得分:1)

您可以在帮助程序中包含其他集合。它可能看起来没有做任何事情,但如果其中的任何内容发生变化,它应该使助手重新运行。

Template.productEdit.helpers({
    'locationsInventory': function(_productId) {

       // Add this
       Locations.findOne(); 

       return Inventory.find({productId: _productId}, {transform: function(doc) {
                doc.name = Locations.findOne(doc.locationId).name;
                return doc; // Transform is Non-reactive
         }
      });
    }
});