【问题标题】:Javascript Object literal, POST problemsJavascript 对象文字,POST 问题
【发布时间】:2012-08-30 12:33:19
【问题描述】:

我试图让 autocomplete-rails.js 在 Rails 中使用 Ajax,

我有以下功能

<script type="text/javascript">
function reply_click(clicked_id)
{
 var x = "work";
 var y = "monday"
 alert(y)
 $.ajax({
  type    : 'POST',
  url     : "/whens", 
  data: { y : x},
success : function(data) {
            alert(data);          
          },  
});
}
</script>

我遇到的问题是这个返回

"y"=>"work"

我希望它返回 y 的值

"monday"=>"work"

另外,如果我执行以下操作

<script type="text/javascript">
function reply_click(clicked_id)
{
 var x = "work";
 var y = "monday"
 var data = {};
 data[x] = y;
 $.ajax({
  type    : 'POST',
  url     : "/whens", 
  data,
success : function(data) {
            alert(data);          
          },  
});
}
</script>

它似乎返回我得到的问题是它返回

"term"=>"work"

知道如何让它返回 y 的内容

【问题讨论】:

  • 我一直认为对象字面量表示法对于允许不带引号的键是愚蠢的。
  • 那么为什么不使用{monday: "work"}呢?
  • 你不应该有data[y] = x;,而不是data[x] = y;吗?
  • /whens 服务有什么作用?

标签: javascript jquery ruby ajax ruby-on-rails-3


【解决方案1】:

如果一个键没有引号,那并不意味着它使用了一个变量。

正如你提到的,正确的做法是

var data = {};
data[y] = x;
$.ajax({
  type    : 'POST',
  url     : "/whens", 
  data    : data,
  success : function(data) {
            alert(data);          
          },  
 });

注意我把它改成了data[y] = x;

【讨论】:

    【解决方案2】:

    如果您想使用 ajax 加载一些数据,作为回报,这些数据可用于自动完成,然后通过 ajax 加载字符串数组。 例如。 在控制器做-

    def get_characteristics
      unless ['Threads', 'Note'].include?(params[:name])
      @characteristics = Category.all.collect(&:characteristic)
      respond_to do |format|
        format.js{}
      end
    end
    

    在 get_characteristics.js.haml 中(例如在 haml 中)

    var characteristics = #{@characteristics.to_json};
    $('#characteristic').autocomplete( //the id of the text fields where u want autocomplete
      source: characteristics  //the array of string that u want for autocomplete
    )
    

    更多信息http://jqueryui.com/demos/autocomplete/

    【讨论】:

      【解决方案3】:

      variable as index in an associative array - Javascript

      > var x = "work"
      > var y = "monday"
      
      > data= {}
      {}
      > data[x]=y
      'monday'
      > data
      { work: 'monday' }
      

      【讨论】:

        【解决方案4】:

        你不能,第二个 sn-p (data[y] =) 是唯一的方法。原因如下:

        一个对象字面量,就像 JS 中的所有东西一样是一个对象 (duh) 并且具有属性。在全局范围内声明的所有变量都是全局(无名)对象的属性。您拥有的唯一(半)真实变量是您在闭包范围内声明的变量。所以从这个角度来看,在构造对象字面量时不应该引用属性是有道理的。
        我什至会说,在对象字面量的声明中允许引用属性应该被认为是错误的,或者至少应该不鼓励这样做。

        JS 是一门美妙的语言,被一堆不一致、怪癖和坏主意所掩盖。可悲的是,如果您只知道垃圾(几乎每个人都知道垃圾,很少有人知道实际的语言以及它的强大之处),那么一致且的罕见功能一开始看起来就像一个障碍。值得庆幸的是,你有大量的结构可以让你做你想做的事,并且做得很好。

        在这种情况下,你可以把它全部写出来data[a] = b; data[c] = d;...或者你可以使用一个 power-constructor (google it)
        另一个选项只是一个非常小的循环,假设您的数据对象将使用传递给函数的参数填充:

        var data = {};
        var argArray = Array.prototype.slice.apply(arguments,[0]);//returns array of arguments
        var duo;
        while(duo = argArray.splice(0,2))
        {
            data[duo[0]] = duo[1];
            if (argArray.length < 2)
            {
                break;
            }
        }
        

        只是举个例子。我建议您(和其他所有人)在涉及对象时研究 crockfords 的构造,以及 JS 中的函数调用意味着什么:不只是调用函数,而是创建 call-object

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-08
          • 2016-08-10
          • 1970-01-01
          相关资源
          最近更新 更多