-1

这是以下问题。

我的 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);
  });
});

现在,当我在输入字段中输入带有 idterm的字符时,会调用 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不更新。我的代码有什么问题,我该如何解决?

4

1 回答 1

1

看起来您的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 %>;

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

于 2013-04-10T20:48:35.613 回答