我正在用Anki帮助我的5年级儿子学习数学。我的儿子已经到了一个点,他需要回顾如何解决特定的问题,而不仅仅是记住事实。
例如,假设您正在尝试学习如何将分数相乘...
.45 X .61 =?
我需要一种将随机数学问题放入Anki卡中的方法。这意味着该卡将有一天显示
.45 X .61 =?
下次显示该卡时,可能会出现问题。
.34 X .12 =?
搜寻互联网之后,我找到了一篇文章,解释了如何做...
https://yingtongli.me/blog/2015/03/15/random-question-generator-on-anki-using.html
我不是JavaScript开发人员,但是在敲打键盘一周后,就可以使用此技术。
让我解释一下您如何执行此操作,然后再解释问题出在哪里。
安装Anki的2.0版本。
打开Anki并创建一个新的牌组。
向卡座添加新卡。
出现添加卡对话框。最顶部是两个长按钮...“类型”和“甲板”。单击左侧的“类型”按钮。
出现“选择注释类型”对话框。
单击对话框底部的“管理”按钮。
选择基本笔记类型,然后单击左侧的“添加”按钮。
第一个选项应该是“添加基本”。单击对话框底部的“确定”按钮。
命名新的笔记类型。“脚本笔记类型”,然后单击“确定”
打逃生。
现在选择新的注释类型(“脚本注释类型”),然后单击“选择”。
现在我们要添加一个附加字段。默认情况下,此注释类型具有名为“Front”和“Back”的字段。我们要添加第三个名为“脚本”的字段。
左上角附近有一个标记为“字段”的按钮。点击这个按钮。
出现另一个对话框。左侧是“添加”按钮。点击它。
在出现的对话框中输入脚本,然后单击“确定”按钮。
现在,通过单击右侧按钮附近的关闭按钮来关闭当前对话框。
让我们现在设置卡。当前屏幕的左上方附近有两个按钮。右边的按钮标记为“卡片”。单击此按钮。
这是我们设置卡模板的地方。 JavaScript代码的一部分进入了Front Template。目前,这里应该有以下文字...
{{面前}}
删除所有内容并粘贴以下代码。
<script>
function persist(cb) {
window.setTimeout(function() {
// Determine whether to use Anki's Bridge object (Desktop) or sessionStorage (AnkiDroid) to store data across sides.
var dummy = {};
var mode = "dummy";
if (typeof(py) !== "undefined") {
mode = "py";
py.data = py.data || {};
} else if (typeof(sessionStorage) !== "undefined") {
mode = "sessionStorage";
}
var dataObj = {
setItem: function(key, val) {
if (mode === "dummy") {
dummy[key] = val;
} else if (mode === "py") {
py.data[key] = val;
} else if (mode === "sessionStorage") {
sessionStorage.setItem(key, val);
}
},
getItem: function(key, def) {
var val = undefined;
if (mode === "dummy") {
val = dummy[key];
} else if (mode === "py") {
val = py.data[key];
} else if (mode === "sessionStorage") {
val = sessionStorage.getItem(key);
}
if (val == null) {
return def;
} else {
return val;
}
},
tryItem: function(key, val) {
var currVal = dataObj.getItem(key, undefined);
if (currVal == null) {
dataObj.setItem(key, val);
return val;
} else {
return currVal;
}
},
clear: function() {
if (mode === "dummy") {
dummy = {};
} else if (mode === "py") {
window.py.data = {};
} else if (mode === "sessionStorage") {
sessionStorage.clear();
}
}
};
if (!document.getElementById("back")) {
dataObj.clear();
}
cb(dataObj);
}, 0); //Execute after Anki has loaded its Bridge object.
}
</script>
<script>
var code = (function () {/* {{Script}} */}).toString();
code = code.replace(/^[^\/]+\/\*!?/, "").replace(/\*\/[^\/]+$/, ""); //Strip beginning/ending comments.
code = code.replace(/<div>/g, "\n").replace(/<\/div>/g, "\n").replace(/<br \/>/g, "\n"); //Strip HTML.
code = code.replace(/ /g, " ").replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&"); //Replace special symbols.
eval(code);
</script>
<div id="front">{{Front}}</div>
该JavaScript接收我们将放置在“脚本”字段中的JavaScrippt代码,并使用eval语句执行该代码。
请注意,在此代码中,persist函数可以使Anki卡的正面和背面的值保持一致。我的问题与此持久功能有关。
在屏幕的底部三分之一是“返回模板”。删除所有内容并粘贴以下代码...
{{FrontSide}}
<hr id=answer>
<div id="back">{{Back}}</div>
点击右下角的“关闭”按钮。
现在我们需要填写字段。前面和后面的值无关紧要。我将“Front”放在前面,将“Back”放在后面。
对于脚本字段,我们要添加一些代码。粘贴代码之前,我们需要打开HTML View 。确保光标位于“脚本”字段中。
在Anki 2.0版中,屏幕右上方有一个带有向下箭头图片的按钮。 2.1版本带有“...”而不是向下箭头按钮。
单击此箭头,将显示一个菜单。选择“编辑HTML”菜单选项。
粘贴以下代码...
window.setTimeout(function(){
persist(function(data) {
var num1 = data.tryItem("num1",Math.random());
document.getElementById("front").innerHTML = num1;
document.getElementById("back").innerHTML = num1;
});
},0);
在Anki的2.0版本中有效。
这是问题
这是答案...
我们在JavaScript中生成了一个随机数,该值一直保留在Anki卡的正面和背面之间。这为使用随机数的Math和Science Anki卡开辟了可能性世界。
但是,在Whoville,一切都不好。
当您在Anki的2.1版本上运行此代码时,它将不起作用。
脚本将被绕过,并显示Front和Back字段的静态值。
JavaScript仍在执行。我可以在Script字段中放置一个警报语句,它可以工作。
问题出在持久功能上。较新版本的Anki不喜欢Persist功能。
谁能指出我正确的方向。
最佳答案
查看
https://github.com/SimonLammer/anki-persistence
它使用不同的方法来实现持久性。
但是Anki环境在某种程度上是不可预测的,因此您需要检查代码是否已成功初始化。