【发布时间】:2020-07-14 21:42:45
【问题描述】:
如何让 ruby 数据持久保存到 javascript 调用的事件中?
我遇到了关于 javascript 变量的问题。这可能是由于我对范围和使用哪个变量缺乏了解,尽管我尝试了不同的变量类型。 (这是我的第一个实际 javascript 代码)。我在 javascript 中看到范围的方式是这样的:如果它在函数中声明,则不能在函数之外使用它。如果您首先声明它(在函数外部),您可以更新函数中的值并在外部使用它,稍后在不同的标签中使用。我做到了。
我在做什么:我正在遍历一组从 ruby 模型中获得的名称,这里:
<% @items.each do |record| %>
稍后在我的代码中,我在这个 .each 中打开另一个脚本 html 标记:
<script> edit_items("<%=record.name%>") </script>
这个“edit_items”函数为我提供了一个包含所有记录关系名称的数组。 (这是在页面顶部声明的)
y=[];
function edit_items(x){
y.push(x);
}
我遍历这些项目的原因是为每个项目创建侦听器(它们是为用户服务的,因此每个用户都会有一个动态数量)。我有一个带有 li 元素的 ul,其中包含指向模式弹出窗口的链接(html 在同一页面上)。
我想要做的是告诉 javascript 将模式中的输入 (#name_box) 的值设置为来自单击的链接的信息。虽然一个文本框有多个链接,所以我必须指定将哪个 id 发送到该框。在页面底部:
$(document).ready(function() {
console.log("ready");
for (id = 0; id < y.length; id++){
console.log("starting li click events");
$("#" + y[id]).click(function () {
console.log("y: " + y[id]);
console.log("doc: " + document.getElementById(y[id]));
});
}
});
我正在为通过 ruby 数组中的动态数据创建的每个链接创建事件侦听器。问题是:直到页面在客户端时才会运行单击操作。我认为您无法从客户端侦听器获取服务器端数据(ruby)。
当我单击链接时,我在 console.log 中得到了这个:
y: undefined
admin:318 doc: null
admin:317 y: undefined
admin:318 doc: null
这意味着,对我来说 y 存在,但没有设置,并且 doc 没有价值(没有找到具有未定义数据的元素)。
【问题讨论】:
-
y可能在您在这里尝试使用它的上下文中不可用。你在哪里声明edit_items函数?因为除非它是全局声明的,你几乎肯定不想这样做,否则它将无法在$(document).ready(function(){}中使用。 -
@ellitt 在 html 页面的顶部声明它。
-
我认为您可能会以不同的方式执行此操作,而不是尝试将单击事件绑定到基于 javascript 数组的元素。因此,如果您对此持开放态度,我可以尝试写一个更详细的答案。
-
当然,我对想法持开放态度。我正在使用 Ruby 2.6.5 和 Rails 6.0.2
-
@ellitt 我明白了....:) 不要浪费你的时间,我还是会看看你要说什么,但我会在下面给出我的答案也做了。
标签: javascript jquery html ruby-on-rails ruby