替换关联数组变量

时间:2013-04-10 20:22:13

标签: javascript ruby-on-rails ruby-on-rails-3 associative-array

以下是以下问题。

我的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没有更新。我的代码有什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:1)

看起来你的names_hash(你在回程中通过var names_hash重新定义,然后阴影任何更高范围的变量)与你引用它的范围不同点击。感谢您的包装功能。您将需要某种方式 - 通过事件或回调等等 - 来访问该范围内的变量并将其设置为您希望使用的值。

修改

一个非理想但样本的解决方案,以进一步解释woudl:

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 %>;

中提琴。您已经保护了全局范围,并且您还在包装函数之外公布了要访问的函数。