我想在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()
}
});
答案 0 :(得分:3)
将您的代码包装在Meteor.defer
中,如下所示:
Template.createTradeForm.onRendered(function(){
Meteor.defer(function(){
$('#ship').chosen();
});
});
Meteor.defer
对应setTimeout
0
,但不在文档中。
它通常会解决您依赖的DOM中的某些东西尚未呈现的情况。
答案 1 :(得分:1)
我只能推测原因,因为需要更多的调试信息。 (没有超时会发生什么?是找到DOM元素,是找到jQuery插件chosen
等。)
首先rendered
和onRendered
是相同的,后者是当前版本,而rendered
是为了与旧代码兼容而保留的。重要的是要知道两者都只运行一次。对于您的问题,我的猜测是,您正在看到由尚未加载的订阅数据引起的时间问题。尝试使用subscribe设置reactive variable。
Meteor.subscribe('items', function() {
readyItems.set(true);
});
然后依靠反应变量来使用chosen
:
Tracker.autorun(function() {
if(readyItems.get()) $('#ship').chosen();
});