我有一个表,其中的列之一是Bootstrap Switch元素,以后将用于打开或关闭该行的相应元素。
<tbody>
{{#each sensorslist}}
<tr>
<td>{{name}}</td>
<td>{{mac}}</td>
<td>
<input type="checkbox" class="on-off-checkbox" checked={{state}} />
</td>
</tr>
{{/each}}
</tbody>
但是,如果我对一行进行硬编码,那么一切都很好,并且开关总是出现。但是,当我如图所示从数据库中的传感器列表加载时,仅当我通过链接转到该页面时才会显示(我正在使用Iron Router)。如果按F5,则不会显示Bootstrap开关。
我没有使用自动发布。我正在订阅客户端中的传感器集合:
Sensors = new Mongo.Collection("sensors");
Meteor.subscribe('sensors');
并使用以下帮助程序加载数据:
Template.sensores.helpers({
'sensorslist': function(){
return Sensors.find();
}
});
还要渲染元素,我将其作为渲染函数:
Template.sensores.rendered = function (){
$('.on-off-checkbox').bootstrapSwitch({
'offColor': 'danger'
});
};
如我所说,如果仅使用菜单在Web应用程序中移动,则工作正常,如果我使用F5刷新页面或使用直接链接简单地转到该页面将无法正常工作。
我注意到,如果我使用setTimeout在呈现的代码中执行该代码,并添加足够的时间,它将始终有效,因此我想我缺少了一些东西...
提前非常感谢您!
最佳答案
我遇到过与您以前相同的问题。
据我所知,当呈现Template.sensores
时,数据上下文sensorslist
并未完全加载,因此我们无法在sensorslist
块下查询DOM。
但是,当您使用setTimeout
足够的时间时,它可以正常工作,因为sensorslist
下的DOM已完全呈现。
我的解决方案是另外使用另一个模板:
template(name='sensores')
...
<tbody>
{{#each sensorslist}}
{{> sensorsList}}
{{/each}}
</tbody>
...
template(name='sensorsList')
<tr>
<td>{{name}}</td>
<td>{{mac}}</td>
<td>
<input type="checkbox" class="on-off-checkbox" checked={{state}} />
</td>
</tr>
引导开关位于
sensorsList
模板的呈现功能中。由于此模板的渲染次数是数据上下文
sensorslist
长度的多少倍,因此,我们要操作的每个DOM都应在其自己的模板实例范围内。Template.sensorsList.rendered = function () {
this.$('.on-off-checkbox').bootstrapSwitch({
'offColor': 'danger'
});
};