2011-01-02 12 views
2

EDITED:問題は関数 'find_callback'にあり、responseArrayという名前のグローバル配列にそれぞれの応答を挿入します。応答はオブジェクトの配列です。JavaScript関数はオブジェクトをグローバル配列変数にプッシュしません

私は、検索配列からOpenLayersのWaze実装にマーカーを追加しようとしています。私は複数の検索を実行し、結果を蓄積したい。私は3つの関数、onInit()find_callback()addPoint()を使用します。 'find_callback'関数を呼び出すと、以前のマーカーが上書きされます。それは

function addPoint(response){ 
    var first_result = response; 
    var lon = first_result.location.lon; 
    var lat = first_result.location.lat; 
    map.setCenter(new OpenLayers.LonLat(lon,lat)); 

    var markersPoint = new OpenLayers.Layer.Markers("Markers"); 
    markersPoint.addMarker(
     new OpenLayers.Marker(
      new OpenLayers.LonLat(
       lon, 
       lat 
       ), 
      icon.clone() 
      ) 
     ); 
    g_waze_map.map.addLayer(markersPoint); 

    map.addPopup(
     new OpenLayers.Popup.FramedCloud(
      "point_"+first_result.location.lat, 
      new OpenLayers.LonLat(lon,lat), 
      null, 
      "<div style='font-family:Arial,sans-serif;font-size:0.8em;'>" 
      +first_result.name+"<div>", 
      anchor=null, 
      true, 
      null 
      ) 
     ); 

} 


//called when map loads 
function onInit(){ 
    map = g_waze_map.map; 

    size = new OpenLayers.Size(15, 20); 
    offset = new OpenLayers.Pixel(-(size.w/2), -size.h); 
    icon = new OpenLayers.Icon('http://www.waze.co.il/images/home.png',size,offset);   

    // array for the points 
    responseArray = new Array(); 
    // find callback 
    find_callback = function(response){ 
     for (var i=0, length = response.length; i<length; i++){ 
      responseArray.push(response[i]); 
     } 
     // alert(responseArray[0]); // working, getting an object 
    } 
    // alert(responseArray[0]); // not working, getting 'undefined' 

    //search API example, calls 'find_callback' when search returns 
    g_waze_map.find('Turin','find_callback'); 
    g_waze_map.find('Rome','find_callback', true); 
    // adding the points 
    for (var i=0, length = responseArray.length; i<length; i++){ 
     addPoint(responseArray[i]); 
    } 
}; 

おかげであるように、コード

/* array of search results (up to 10) sorted by relevancy */ 
[ { 
    //bounds that contain the this map feature (set map to this extent for closest zoom) 
    "bounds":{"bottom":32.0880470275879, 
    "left":34.7883338928223, 
    "right":34.7912673950195, 
    "top":32.0854721069336}, 
    //location of the feature 
    "location":{"lat":32.08560397003471,"lon":34.78999763465419}, 
    //name of feature 
    "name":"Street, City" 
    }, 
    //up to 9 more results 
    // ... 
] 

g_wzae_map.find('THE LOCATION', 'find_callback'); 

応答:私は、単一の検索を実行すると!

+1

toループ配列には使用しないでください。代わりにfor(var i = 0、length = response.length; i Hemlock

+0

こんにちは、それは重要ですか?とにかく私はforループを変更しましたが、関数 'find_callback'の外でresponseArrayを取得することはできません。ループの外側で 'find_callback'の内部でチェックするとうまくいきますが、関数onInit()から取得しようとすると 'undefined'が返されます。 –

+0

@Sophia:配列に設定された追加のプロパティは 'for for'ループに含まれています。これは、[プロトタイプ](http://www.prototypejs.org/api/array)のようなJSライブラリを使用している場合、配列に多くの追加メソッドを追加する場合には問題です。また、[グローバルは悪です](http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=globals+are+bad)代わりに、[closures](http://jibbering.com/faq/notes/closures/)を使用してください(より簡単な説明が必要な場合は、[Morris Johns's](http://blog.morrisjohns.com/javascript_closures_for_dummies.html) )。 – outis

答えて

1

g_waze_map.find()asynchronousです。このため、結果を処理するためにコールバックが使用されます。 findが返された場合、検索結果はおそらく利用できません。 addPointonInitから呼び出す代わりに、find_callbackで直接呼び出してください。

find検索結果を別のページに読み込みます。結果がグローバル変数として格納されている可能性があります。後で呼び出してページを読み込んだときに壊れてしまいます。その場合は、findの最初の呼び出しを除くすべてをfindコールバックに移動できます。

//called when map loads 
function onInit(){ 
    var map = g_waze_map.map; 

    var size = new OpenLayers.Size(15, 20); 
    var offset = new OpenLayers.Pixel(-(size.w/2), -size.h); 
    var icon = new OpenLayers.Icon('http://www.waze.co.il/images/home.png',size,offset);   

    function addPoint(response){ 
     var first_result = response; 
     var lon = response.location.lon; 
     var lat = response.location.lat; 
     //g_waze_map.map.setCenter(new OpenLayers.LonLat(lon,lat)); 

     var markersPoint = new OpenLayers.Layer.Markers("Markers"); 
     markersPoint.addMarker(
      new OpenLayers.Marker(
       new OpenLayers.LonLat(lon, lat), 
       icon.clone() 
     ) ); 
     g_waze_map.map.addLayer(markersPoint); 

     g_waze_map.map.addPopup(
      new OpenLayers.Popup.FramedCloud(
       "point_"+lat, new OpenLayers.LonLat(lon,lat), null, 
       "<div style='font-family:Arial,sans-serif;font-size:0.8em;'>"+response.name+"<div>", 
       null, true, null 
     ) ); 
    } 

    // array for the points; this could be dropped 
    var responseArray = []; 
    function addPoints(response) { 
     // if you want to save the responses for other purposes 
     Array.push.apply(responseArray, response); 
     for (var i=0, length = response.length; i<length; i++){ 
      addPoint(response[i]); 
     } 
    } 

    var terms = ['Rome']; 
    window.find_callback = function(response){ 
     addPoints(response); 
     if (terms.length) { 
      g_waze_map.find(terms.pop(),'find_callback', true); 
     } 
    } 

    g_waze_map.find('Turin','find_callback'); 
}; 
+0

問題は、find関数で前のレイヤーを上書きすることです。たとえば、findには多くの結果があり、コールバック関数から1回の呼び出しで多くのマーカーを追加できますが、2回目の.find呼び出しでは前の結果よりも優先されます。このため、すべての結果を1つの配列に集めようとしました。 –

+0

@ソフィア:あなたは何が起きているのですか?インタラクティブなデバッガを使って動作を観察しましたか?私がWaze [例のページ](http://www.waze.co.il/test_api/)でテストしたところ、別のことが示唆されています。自分のライブページへのリンクは、あなたが記述した動作を再現するのに役立ちます。 'addPoint'も関数に移動され、すべての変数は' var'でローカル宣言されるべきです。 – outis

+0

私はそれをチェックしますが、例のページはそれほどうまくいかないのです。最後のクエリ、最後の.find呼び出しのみを表示しています。 –

関連する問題