替换关联数组变量

Replacing an Associative Array Variable

本文关键字:变量 数组 关联 替换      更新时间:2023-09-26

问题如下:

我的javascript文件包含以下代码…

$(function() {
  var names;
  var names_hash = { };
  // When an user types in a letter in the student name input field
  $(".container").on("keyup", "#term", function(){
    // Here we are submitting the form via AJAX. The form contains necessary
    // Rails code to initiate the AJAX        
    $(this).parents(".student-search-form").submit();
  });
  $(".container").on("click", ".add_nested_fields", function() {
    var term = $("#term").val();
    console.log(names_hash);
  });
});

现在,当我在输入字段中输入id为term的字符时,调用Rails控制器动作并使用以下javascript响应。

仅供参考,@group_users_hash只是一个Ruby哈希值,我必须调用html_safe,以便它可以正确转换为Javascript关联数组(是的,我知道它真的只是一个对象)。

names_hash = <%= @group_users_hash.html_safe %>;
console.log(names_hash);

所以当AJAX完成时,我看到console.log(names_hash);已经在我的控制台上产生了

Object {1: "Jason"}

但是当我点击.add_nested_fields调用on事件时,我的控制台日志显示

Object {} 

我不知道为什么assoc_array没有更新。我的代码有什么问题,我该如何修复它?

看起来您的names_hash(无论如何通过var names_hash在您的返回中重新定义,然后阴影任何更高作用域的变量)与您在点击时打印它的作用域不同。多亏了您的包装器函数。您将需要一些方法-通过事件或回调等-访问该范围内的变量并将其设置为您希望使用的值。

编辑

一个非理想但可以进一步解释的示例解决方案是:

var names_hash = {};
$(function() {
  $(".container").on("click", ".add_nested_fields", function() {
    console.log(names_hash);
  });
});

当你收到回复时,你只需:

names_hash = <%= @group_users_hash.html_safe %>;

然后你应该是金色的。这不是理想的原因是因为您的names_hash在全局作用域中浮动。最好使用"命名空间",例如:

(function() {
  // prevent redefining it if it's already defined via another file
  var MyNamespace = window.MyNamespace || {};
  MyNamespace.names_hash = {};
  window.MyNamespace = MyNamespace;
})();
$(function() {
  $(".container").on("click", ".add_nested_fields", function() {
    console.log(MyNamespace.names_hash);
  });
});

从那里你修改你的回答:

MyNamespace.names_hash = <%= @group_users_hash.html_safe %>;

和中提琴。您已经保护了全局作用域,并且还公开了希望在包装器函数之外访问的函数。