2011-12-08 13 views
0

jQueryのgetJSONメソッドを使用してcoldfusionデータベースコントローラへの呼び出しが成功しました。返される情報はフォーマットに戻ってくる:getJSONオブジェクトを作成する

{ 
    "COLUMNS": ["PRODUCT_HIERARCHY", "WEBPRODLINE", "POSITION", "FEATURES", "BENEFITS", "LINKS", "VIDEOS", "IMAGE_CUTAWAY", "MARKEDASNEW"], 
    "DATA": [ 
     ["23456689", "ProdName1", "A Feature 1", "A Benefit 1", "url", "vid_url", "img_name", "N"], 
     ["234566891", "ProdName2", "A Feature 2", "A Benefit 2", "url", "vid_url", "img_name", "N"] 
    ] 
} 

は、私は今、私はその後、ローカルフィルタの代わりに、DBに別の電話をかけることができますオブジェクトとして返された情報を格納したいです。問題はinitializeView関数にあります。ここでは、関連するスクリプトは次のとおりです。

$(document).ready(function() { 

    var productsFlag = false; 
    var enableLog = true; 

    var allProducts = $.getJSON(jsonURL, { method: "getAllProducts", returnformat: "json" }, function(data) { 
     productsFlag = true; 
    }); 

    waitOnJson(); 

    function waitOnJson() { 
     //this shows up in the log 
     logThis('areProductsReady?'); 
     if (productsFlag) { 
      //this shows up in the log 
      logThis('productsFlags ready'); 
      initializeProductView(); 
     } else { 
      //this shows up in the log 
      logThis('productsFlags not ready'); 
      t = setTimeout(waitOnJson, 100); 
     } 
    } 

    function initializeProductView() { 
     //this shows up in the log 
     logThis('initializeProductView'); 
     //this displays [object Object] 
     alert(allProducts); 
     //this displays undefined 
     alert(allProducts.DATA); 
     $.each(allProducts.DATA, function(i, item) { 
      //this doesn't show up in the log 
      logThis(item[1]); 
     }); 
    } 

    //as you can tell, this writes out to a debug console on the page 
    function logThis(eventString) { 
     if (enableLog === true) { 
      $('<p/>').append(eventString).appendTo("#log"); 
     } 
    } 

}); 

私は問題がgetJSONを返しているかについての理解の私の不足であることを確信しているが、私はどちらかあまりにも多くのカフェインまたは十分ではありませんが持っていたと私はそれを見ていませんよ。助けて!

また、私のブロッキング待機段階の考えはありますか?いくつかの異なる機能でデータを使用できるようにしたいが、ビューを初期化する前にデータが読み込まれるまで待つ必要がある。

答えて

2

まず最初に、あなたのようなjsonレスポンスを待つ必要はありません。 getJSONメソッド呼び出しの関数は、応答を受け取ったときにのみ返ります。終了したら、JSON呼び出しの結果をメソッド呼び出しの最初の引数として返します。

$(document).ready(function() { 

    $.getJSON(jsonURL, 
    { 
     method: "getAllProducts", 
     returnformat: "json" 
    }, function(allProducts) { //This function only executes when the response is received. 

     //You access your products array here and do whatever you need with them 
     alert(allProducts != null); 

    }); 


}); 

うまくいけば、多少物事をクリアします。だから、あなたはこのような何かを行うことができます(私は、単純化のために自分のものうちの多くを取り除い)。

はEDIT:getJSONメソッドはJSON AJAX要求の結果を返さないので、あなたのinitializeProductView方法でアラートがあなたが混乱しているものであれば、あなたのコメントを読んだ後、それはおそらくだ、それはjqXHR object返します。そのため、.DATA属性は定義されていません。これの効果があった場合、それは潜在的に機能します(返されたJSONにはaがあると仮定します)。データメンバー):

var allProducts = null; 

$.getJSON(jsonURL, 
    { 
     method: "getAllProducts", 
     returnformat: "json" 
    }, 
    function(data) { 
     productsFlag = true; 
     allProducts = data; 
    } 
); 

私の誤解を早めに申し訳ありません。

+0

お返事ありがとうございます。私はgetJSONでコールバック関数がどのように動作するのかを知っています。しかし、私はコールバック関数の外で初期化しているので、後でビューを後で再初期化する必要があります(たとえば、誰かが商品フィルタをリセットした場合など)。私が上に掲載したのは、データを正しく割り当てていないか、またはinitializeView関数で正しく参照していないことです。 –

+0

コードを少し簡単に説明したので、私はあなたのコメントを読んだ後に上記のいくつかの追加情報を入れました。申し訳ありません。 – jamesmillerio

+0

LOL!私はちょうど私が自分の質問に答えようとしていました。私はあまりにも頑固すぎて、元のコードがうまくいくと確信していました。 –

0

.getJSON()で送信された匿名コールバック関数で、現在待機中のすべての処理を行うだけではどうですか?はるかにクリーンで、あなたはsetTimeoutギグを続ける必要はありません。

initializeProductView()で何が起こっているかは、明らかに呼ばれています。そのコードを投稿してください。あなたは間違いなくコールバックでdata parmで何かをする必要があります。今は使用されていません。参考のため

、そしてよく見る、HERESにgetJSONページ:http://api.jquery.com/jQuery.getJSON/


EDIT:あなたはJSON応答で何もしていません。コールバックでは、データparmで何かをする必要があります。 initializeProductView()でどのようにアクセスしていますか?


編集2:readyによって呼び出された匿名関数が正しく閉じられていません。


EDIT 3:近くに見ると、あなたは無名関数のメソッドとしてwaitOnJson()initializeProductView()logThis()を定義しました。関数が呼び出されると、関数は最上位レベルの関数であるかのように呼び出されます。あなたの無名関数は実際には関数を定義するのではなく、関数を定義するのではなく、関数を呼び出す必要があります。

+0

ご回答いただきありがとうございます。これをgetJSONコールバック関数から移動させる理由は、別のgetJSON呼び出しを行わずにデータを後で再初期化できるようにするためです。アイデアは、データベースへの呼び出し回数を減らすことです。私はちょうど製品リストを一度入手し、そのデータをローカルオブジェクトに格納し、必要に応じて処理したいと考えています。 initializeProductView()関数については、これまでのところすべてを見ています。ログには何も追い出されていません。 –

+0

@Chris、私の編集を参照してください。また、あなたの投稿は「productsFlags ready」*がログに表示されていると言っています。それは表示されていますか? –

+0

@ChrisStahl、私の編集#2を参照してください。 –

関連する問題