使用jquery库的Meteor Template.onRendered或Template.rendered?

时间:2015-07-14 15:15:29

标签: jquery meteor

我想在meteor中使用selected(一个jquery库),我只需要使用这段代码:

    $('#ship').chosen();

我尝试使用.onRendered,但我需要等待,如果我想让它工作

Template.createTradeForm.onRendered(function(){
    //Strange bug, need to wait here or it doesn't work..
    setTimeout(function(){
        $('#ship').chosen();
    }, 2000);
});

此解决方案存在同样的问题:

Template.createTradeForm.rendered = function(){
    //here again, I need to wait or it doesn't work
    setTimeout(function(){
        $('#ship').chosen();
    }, 2000);
};

这个问题还有其他解决办法吗?这个setTimeout在这里并不是很好。

修改 我的助手按要求

Template.createTradeForm.helpers({
    'getShips': function(){
        return Ship.find()
    }
});

2 个答案:

答案 0 :(得分:3)

将您的代码包装在Meteor.defer中,如下所示:

Template.createTradeForm.onRendered(function(){
    Meteor.defer(function(){
        $('#ship').chosen();
    });
});

Meteor.defer对应setTimeout 0,但不在文档中。 它通常会解决您依赖的DOM中的某些东西尚未呈现的情况。

一些参考文献:123

答案 1 :(得分:1)

我只能推测原因,因为需要更多的调试信息。 (没有超时会发生什么?是找到DOM元素,是找到jQuery插件chosen等。)

首先renderedonRendered是相同的,后者是当前版本,而rendered是为了与旧代码兼容而保留的。重要的是要知道两者都只运行一次。对于您的问题,我的猜测是,您正在看到由尚未加载的订阅数据引起的时间问题。尝试使用subscribe设置reactive variable

    Meteor.subscribe('items', function() {
        readyItems.set(true);
    });

然后依靠反应变量来使用chosen

    Tracker.autorun(function() {
        if(readyItems.get()) $('#ship').chosen();
    });