2012-08-30 102 views
0

我試着讓自動完成,rails.js與阿賈克斯Rails的工作,JavaScript對象字面,POST問題

我有以下功能

<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" 
01值

而且,如果我做了以下

<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" 

任何想法如何,我可以得到它返回Ÿ

的內容
+0

我一直認爲對象文字符號是愚蠢的,因爲允許未加引號的鍵。 –

+0

那麼爲什麼不使用'{monday:'work'}'呢? –

+4

不應該有'data [y] = x;',而不是'data [x] = y;'? –

回答

2

如果一個關鍵字沒有引號,那並不意味着它使用了一個變量。

做的正確的方法,因爲你提到的是

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

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

+0

This Works!非常感謝大家的答覆! :) – Namenone

0

如果u想加載使用ajax的一些數據作爲回報,可用於自動完成然後通過ajax加載字符串數組。 例如。 在控制器DO-

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/

0

你可以用」 t,第二個片段(data[y] = )是唯一的方法。原因如下:

與JS中的所有東西一樣,對象字面值是一個對象(duh)並且具有屬性。在全局範圍內聲明的所有變量都是全局(無名稱)對象的屬性。你所擁有的唯一(半)真實變量就是你在閉包範圍內聲明的變量。所以從這個角度來看,它有理由說當構造一個對象文字時不應該引用屬性。
我甚至會說,在對象字面量的聲明中允許引用的屬性應該被認爲是錯誤的,或者至少應該被阻止。

JS是一種美妙的語言,被一堆不一致,怪癖和不好的想法所掩蓋。可悲的是,如果你知道的只是垃圾(幾乎每個人都知道垃圾,很少有人知道實際的語言和它的力量),那麼一貫的和好的看起來像是一個障礙。謝天謝地,你有許多構造可以讓你做你想做的事,做得很好。

在這種情況下,你可以只寫了這一切data[a] = b; data[c] = d;...OR你可以使用一個電源的構造函數(google一下)
的另一種選擇是隻是一個非常小的循環,假設你的數據對象將使用填充傳遞給函數的參數:

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