2014-10-09 106 views
9

我不得不将渲染回调分配给我的所有模板。渲染流星火焰中所有模板的回调

直到0.9.0我用来做这样的:

_.each(Template, function(template, name) { 
    //... 
    template.rendered = function() { 
    //... 
    }; 
}); 

但现在,模板是一个构造函数,而不是一个对象,所以这种方法不会在这里工作。当使用Blaze渲染所有模板时,是否有任何方法将回调函数传递给所有模板或引导函数?

回答

9

这是我想出的一个快速解决方法,遍历每个Template属性以查明它是否对应于模板定义,如果是,请分配onRendered回调。

// make sure this code is executed after all your templates have been defined 
Meteor.startup(function(){ 
    for(var property in Template){ 
    // check if the property is actually a blaze template 
    if(Blaze.isTemplate(Template[property])){ 
     var template=Template[property]; 
     // assign the template an onRendered callback who simply prints the view name 
     template.onRendered(function(){ 
     console.log(this.view.name); 
     }); 
    } 
    } 
}); 

我不知道你的用例是什么,所以根据它可能会有更好的解决方案。

+1

这实际上是我需要的,但任何想法在哪里把这个代码,以便加载后所有的模板已被定义?而不是检查'Template [property] .viewName',可以使用Blaze.isTemplate函数 – 2014-10-09 15:02:51

+1

感谢Blaze.isTemplate'建议,我更新了我的代码以使用客户端'Meteor.startup'来确保它是每个模板定义后执行。 – saimeunt 2014-10-09 15:07:27

+0

工程就像一个魅力!十分感谢! – 2014-10-09 15:12:05

-4

随着Meteor 1.2.1的模板对象具有onRendered(钩子)函数来完成一个'所有模板'onRendered行为。

Template.onRendered(function(){ 
    var template = this; 
    Deps.afterFlush(function() { 
    console.log("triggering Jquery mobile component creation for "+template.view.name); 
    $(template.firstNode.parentElement).trigger("create"); 
    }); 
}); 

通过Deps.afterFlush(回调)的推迟的更新是可选的,以你的应用需求。

+2

我在流星1.2.1上,但是这个解决方案不起作用: 'TypeError:Template.onRendered不是一个函数' – 2016-02-10 14:23:28

+0

不知道为什么这对你没有效果,显然是其他人对你投票的答案,但是这个功能在我的几个生产应用中按预期工作。查看[源代码](https://github.com/meteor/blaze/commit/1d175814f1d9ad857743601f55073395dbdfedad),如果可能的话确认你的Template对象实际上是一个Meteor Blaze模板对象,并且不会被替换/变异... – user1756588 2016-10-05 15:10:05

+0

刚刚检查过流星1.4和'Template.onRendered'是'undefined'。 – 2017-05-03 09:27:30