2017-12-04 18 views
0

私は、追加のプロパティと、select要素の項目に対応する情報を含むJavasciptオブジェクトの配列を持っています。Javascriptオブジェクトのプロパティから正しくない値を返すJavascript

ユーザーがドロップダウンで要素を選択すると、要素がJavascript配列内に表示され、ページ上の他の2つのフィールドに、対応するJavasciptオブジェクトの関連する値が設定されます。ここで

がjsの関数である:

<select onchange="pickedCode(this);" name="ctl00$ContentPlaceHolder1$lstCodes" id="ctl00_ContentPlaceHolder1_lstCodes"> 
    <option value=""></option> 
    <option value="70">3-DAY NOTICE</option> 
    <option value="156">A-ABSOLUTE TRANSCRIPT</option> 
    <option value="47">ABORTED EVICTION</option> 
    <option value="204">ACCESS AGREEMENT</option> 
    <option value="174">ADD'L SERVES/MAILINGS</option> 
    <option value="124">AFF IN OPP - COMMERCIAL</option> 
</select> 

...と、ここでJavasciptデータの配列です:

function pickedCode(who) { 
     who = $(who); 
     var opt = who.find(':selected'); 
     var val = opt.val(); 

     for (lc = 0; lc < codes.length; lc++) { 
      var code = codes[lc]; 
      if (code.Id == val) { 
       var amt = code.Dollars; 
       alert(code.Dollars) 
       $('input[field=amount]').val((amt > 0 ? amt : '')); 
       $('textarea[field=text]').val(code.Text); 
       break; 
      } 
     } 
    } 

...ここでは関数を呼び出しているHTMLは次のようになります。

var codes = [{ 
     "Id": 70, 
     "Code": "3-DAY NOTICE", 
     "Text": "Initiation of Non-Payment Proceeding.", 
     "Dollars": "46.20" 
    }, { 
     "Id": 156, 
     "Code": "A-ABSOLUTE TRANSCRIPT", 
     "Text": "A-ABSOLUTE TRANSCRIPT", 
     "Dollars": "0.00" 
    }, { 
     "Id": 47, 
     "Code": "ABORTED EVICTION", 
     "Text": "THE MARSHAL HAD TO ABORT TODAY'S SCHEDULED EVICTION AS ", 
     "Dollars": "0.00" 
    }, { 
     "Id": 204, 
     "Code": "ACCESS AGREEMENT", 
     "Text": "ACCESS AGREEMENT", 
     "Dollars": "0.00" 
    }, { 
     "Id": 174, 
     "Code": "ADD'L SERVES/MAILINGS", 
     "Text": "ADD'L MAILINGS", 
     "Dollars": "0.00" 
    }, { 
     "Id": 124, 
     "Code": "AFF IN OPP - COMMERCIAL", 
     "Text": "Aff in Opp - COMMERCIAL", 
     "Dollars": "85.05" 
    } 
] 

適切な要素を検索しています。
テキストを取得してテキストエリアに正しく設定しています。

問題はプロパティDollarsです。何らかの理由で、Dollarsプロパティの値が0より大きいアイテムであっても、常に"0.00"の値が返されます。なぜなら、私の人生は理由を理解できません。もともと、それはAmountと命名されました。私は予約語なのかもしれないと思ったので、Dollarsに変更しました。私はもともと文字列の代わりに実際の数値としてそれを持っていましたが、それと同じ問題が残っていました(それはいつも0を返しました)。おそらくそれを変数に代入する際の問題だと思ったので、変数の代わりに実際のプロパティ自体に警告しました(警告はデバッグ用です)。

私も考えましたcode.Id == valをチェックするときにタイプの問題でしたが、実際には適切なアイテムを見つけてプロパティテキストを取得しているため、それは問題にはなりません。

私はここで類似しているいくつかの他の質問を見つけましたが、それらはすべて、そのプロパティ自体が配列であり、ユーザがそのプロパティにインデックスを作成していないことに関連しているようです。鉱山は配列ではありませんが、個々のプロパティはまったくまっすぐな値です。

Firefox(57.0)とGoogle Chrome(62.0.3202.94)の両方でこれを試し、Opera(49.0.2725.47)でも試してみましたが、3つのブラウザすべてで同じ結果が得られました。

自分自身を真実に混乱させるだけで、私はFirefoxのクライアントサイドデバッガを実行し、何が起こるかを知ることに決めました。ページのソースを表示するとき、明らかに46.2の値を持っています: enter image description here

しかし、関数をステップ実行して変数を見ると、配列からそのコードを引き出すときに値をロードしています0.00の値をメモリに格納します。 enter image description here これで、メモリにロードされている値が実際のソースと一致しないため、私は何が起こっているのか完全に混乱しています。私は...とBAHを確実にするためにコードを検索しました!スクリーンショットを見ると、思考が始まり、わかりました。後世のための答えになる詳細。

+0

[これはJSONではありません](http://benalman.com/news/2010/03/theres-no-suchthing-as-a-json/) – Quentin

+0

http://jsbin.com/ vusiqupiru/edit?js、console - 私は問題を再現できません。 – Quentin

+0

精度のためにJSONとJavascriptをすべて置き換えました。 – eidylon

答えて

0

だから、私の思考プロセスにきっかけと@ sandy_22のコメントやJavaScriptデバッガからのスクリーンショットの組み合わせとして、これを考え出しました。

コードで保持されている配列は、コードビハインドからリテラルを使用して割り当てられました。
var codes = <asp:literal id="ltlCodes" runat="server"/>などです。

ページ上の他のドロップダウンを変更すると、AJAXを介して、選択されたクライアントに基づいてリテラルをリバインドします(異なるクライアントの料金は異なります)。

これはすべて正常に動作し、リテラルが更新され、ソースが適切に更新されました。View Sourceを実行すると、更新された配列が表示されます。

しかし、それは新しい配列をcodes変数にリロードすることはありません。したがって、ソースコードが正しい配列データを示していても、メモリ内の変数自体は依然としてデータの元のコピーを保持していました。

リテラルを取り出したので、クライアント側のコードはちょうどvar codes = null;になりました。
次に、サーバー側で、クライアントを切り替えてコードを再バインドするときに、JavaScriptのスニペットを次のように更新します。
AjaxManager.ResponseScripts.Add("codes = " & linqForNewArray() & ";")
この方法では、メモリ内の変数が実際に更新され、すべて正常に動作します。

-1

var amt = codeを置き換えてみてください。ドル;以下で:

var amt = Number(code.Dollars); 
+0

喜びはありません。それは 'Number(...)'と 'new Number(...)'の両方として試してみました。いずれにせよ、それはまだ「0」として出てくる。 – eidylon

関連する問題