1

ここでレールとjqueryを使用して動的選択を試みています。コードは次のとおりです

<div class = "line_items">  

<%- calc = Hash[Item.all.map{|p| [p.id, p.quantity]}].to_json %>

<div class = "item"><%= f.collection_select :item_id,Item.all,:id,:title, :prompt => "Select a Item", input_html: {data:{calc: calc} %></div>

   <div class ="quantity"> <%= f.text_field :quantity %></div>
/*rest  of code*/
</div>

ビューのjavascriptは次のとおりです

jQuery(document).ready(function(){
    jQuery('.item').bind('change',function() {
    var selectElement = jQuery(this);
    var  itemSelected = jQuery('.item:selected').val();
    var wrapperDivElement = selectElement.parent(".line_items");
    var quantity= eval(selectElement.data("calc"))[itemSelected];
    jQuery(".quantity", wrapperDivElement).val(quantity);
  });
});

アイテムを変更すると、firebug で次のエラー が発生eval(selectElement.data("calc"))[itemSelected] is undefinedします。誰かが私が間違っているところを指摘できますか? また、数量を取得するためのより良い方法。私がやっている方法は粗雑だと感じています。どんなガイダンスも役に立ちます。前もって感謝します。

4

2 に答える 2

1
jQuery(document).ready(function(){
    jQuery('.item select').bind('change',function() {
    var selectElement = jQuery(this);
    var  itemSelected = selectElement.val();
    var wrapperDivElement = selectElement.parents(".line_items");
    var quantity= eval(selectElement.data("calc"))[itemSelected];
    jQuery(".quantity input", wrapperDivElement).val(quantity);
  });
});

itemSelectedの値が検出されなかったため、エラーが発生したと思います。上記の再定義されたコードは機能するはずです。ただし、このようなデータを取得しないことを強くお勧めします。コントローラから関連データを取得するには、json呼び出しまたはajax呼び出しを実行することをお勧めします。parents代わりparentにコードで使用してください:)

于 2012-09-13T10:01:44.763 に答える
0

インデックスによる参照と ID による参照を混同していると思います。私は Javascript のウィザードではありませんが、ハッシュに . 次に、変更イベントで「val」値を取得します。これには整数が含まれていますが、インデックスではありません。

次に、値 val を持つ項目ではなく、インデックス val を持つ項目を Javascript で要求します。どちらも Int が必要なため、javascript はそれらを区別できない可能性があります...

それはこの行です:

var quantity= eval(selectElement.data("calc"))[itemSelected];
于 2012-08-17T11:09:22.083 に答える