在 Meteor 上使用 ReactiveVar 时等待 Blaze 上的数据
Wait for data on Blaze when using ReactiveVar on Meteor
我在 Meteor.js 的 Blaze 模板上遇到了一个奇怪的问题。以下模板呈现四次(使用 {{#each}}
运算符)
<template name="circle">
<div class="col-md-6">
<div class="circle-container">
<div class="circle {{option}}" style="border: 9px solid {{color}}">
<div class="circle-text {{option}}" style="color:{{color}}">{{name}}</div>
</div>
</div>
</div>
</template>
数据作为包含对象数组的 ReactiveVar 传递给模板。每个对象在模板上呈现一个圆圈。生成此数据的逻辑如下:
const colorSet = ['red','gold','blue','green','orange','turquoise','wheat','fuchsia','purple'];
const colorNames = ['VERMELHO','AMARELO','AZUL','VERDE','LARANJA','TURQUESA','BEGE','ROSA','ROXO'];
var limit = colorSet.length;
// helper functions
function getRandomPosition() {
return Math.floor(Math.random() * (limit + 1));
}
function getRightColor() {
let position = getRandomPosition();
let rightColor = {
color: colorSet[position],
name: colorNames[position],
right: 'right-option',
};
return rightColor;
}
function getWrongColor() {
let position1 = getRandomPosition();
let position2 = getRandomPosition();
while (position1 === position2) {
position2 = getRandomPosition();
}
let wrongColor = {
color: colorSet[position1],
name: colorNames[position2]
};
return wrongColor;
}
function make4Circles() {
let circles = [];
circles.push(getRightColor());
for (let i = 0; i < 3; i++) {
circles.push(getWrongColor());
}
console.log('circles:', circles)
return circles
}
////
// TEMPLATE HELPERS
///
Template.gameArea.onCreated(function () {
this.circleArray = new ReactiveVar(make4Circles());
})
Template.gameArea.helpers({
circles () => {
return Template.instance().circleArray.get();
}
})
问题是页面有时会缺少数据,给我的印象是在数据准备好之前模板正在渲染。由于 blaze 是反应式的,我认为这不会发生,因为跟踪器会知道数据已更改并会再次重新呈现模板。但事实是,有时它会缺少一些数据。
我查看了所有文档,但不确定我是否遇到了某种错误或做错了什么...
如果有人想要 运行 代码,可以在这个 github 存储库中找到:https://github.com/kemelzaidan
我怀疑问题不是来自 Blaze,而是来自您的数据生成算法。
你的console.log('circles:', circles)
总是输出正确的数据吗?
Math.floor(Math.random() * (limit + 1))
似乎有时会生成一个 超出 数组索引范围的整数。
在你的情况下,limit
将是 9(即你的 colorSet
数组中有 9 个项目,因此索引从 0 到 8),所以 limit + 1
是 10。
然后 Math.floor
on Math.random() * 10
有时会给出 9,这超出了你的数组范围。
=> 只需删除 +1
即可解决您的问题。
我在 Meteor.js 的 Blaze 模板上遇到了一个奇怪的问题。以下模板呈现四次(使用 {{#each}}
运算符)
<template name="circle">
<div class="col-md-6">
<div class="circle-container">
<div class="circle {{option}}" style="border: 9px solid {{color}}">
<div class="circle-text {{option}}" style="color:{{color}}">{{name}}</div>
</div>
</div>
</div>
</template>
数据作为包含对象数组的 ReactiveVar 传递给模板。每个对象在模板上呈现一个圆圈。生成此数据的逻辑如下:
const colorSet = ['red','gold','blue','green','orange','turquoise','wheat','fuchsia','purple'];
const colorNames = ['VERMELHO','AMARELO','AZUL','VERDE','LARANJA','TURQUESA','BEGE','ROSA','ROXO'];
var limit = colorSet.length;
// helper functions
function getRandomPosition() {
return Math.floor(Math.random() * (limit + 1));
}
function getRightColor() {
let position = getRandomPosition();
let rightColor = {
color: colorSet[position],
name: colorNames[position],
right: 'right-option',
};
return rightColor;
}
function getWrongColor() {
let position1 = getRandomPosition();
let position2 = getRandomPosition();
while (position1 === position2) {
position2 = getRandomPosition();
}
let wrongColor = {
color: colorSet[position1],
name: colorNames[position2]
};
return wrongColor;
}
function make4Circles() {
let circles = [];
circles.push(getRightColor());
for (let i = 0; i < 3; i++) {
circles.push(getWrongColor());
}
console.log('circles:', circles)
return circles
}
////
// TEMPLATE HELPERS
///
Template.gameArea.onCreated(function () {
this.circleArray = new ReactiveVar(make4Circles());
})
Template.gameArea.helpers({
circles () => {
return Template.instance().circleArray.get();
}
})
问题是页面有时会缺少数据,给我的印象是在数据准备好之前模板正在渲染。由于 blaze 是反应式的,我认为这不会发生,因为跟踪器会知道数据已更改并会再次重新呈现模板。但事实是,有时它会缺少一些数据。
我查看了所有文档,但不确定我是否遇到了某种错误或做错了什么...
如果有人想要 运行 代码,可以在这个 github 存储库中找到:https://github.com/kemelzaidan
我怀疑问题不是来自 Blaze,而是来自您的数据生成算法。
你的console.log('circles:', circles)
总是输出正确的数据吗?
Math.floor(Math.random() * (limit + 1))
似乎有时会生成一个 超出 数组索引范围的整数。
在你的情况下,limit
将是 9(即你的 colorSet
数组中有 9 个项目,因此索引从 0 到 8),所以 limit + 1
是 10。
然后 Math.floor
on Math.random() * 10
有时会给出 9,这超出了你的数组范围。
=> 只需删除 +1
即可解决您的问题。