2014-07-25 34 views
0

我需要遍歷AJAX響應,並在條件滿足時跳出事件處理程序。我無法使用此代碼:

$.each(response, function(i, v) { 

    // create mapbox object 
    var map = L.mapbox.map('map', v.map_embed_id, { 
     zoomAnimation: false 
    }); 

    var polygonLayer = L.mapbox.featureLayer().loadURL('https://a.tiles.mapbox.com/v4/' + v.map_embed_id + '/features.json?access_token=abcde').addTo(map); 

    polygonLayer.on('ready', function() { 
     var layer = leafletPip.pointInLayer(latlng, polygonLayer, true); 

     if (layer.length) { 
      // this is where I need to break out of $.on 
      // and the current $.each iteration 
     } 
    }); 
}); 

我知道return false會跳出$.each迭代的,但是這是比較困難的,因爲我需要打出來的$.on事件處理程序。我能做什麼?也許我可以使用trigger嗎?

+2

你確定你需要爲'each'的每次迭代綁定事件嗎?這看起來有點可疑,而且可能是我會解決的。 – Utkanos

+0

可以使用[stop propagation](http://api.jquery.com/event.stopimmediatepropagation/)作爲事件處理程序,併爲每個事件返回「false」 –

+0

爲什麼你要綁定一個準備好的事件?你認爲它有什麼作用? –

回答

0

感謝@Kevin B的建議,使用遞歸,這是我如何修復我的代碼,使其工作。

getMapsList().done(function(maps) { 
    getMapboxMap(maps, geocode); 
}); 

function getMapboxMap(maps, geocode) { 

    var map_params = maps[0]; 
    var map_embed_id = map_params.map_embed_id; 

    if (maps.length > 0) 
     maps.shift(); 

    // create mapbox object 
    var map = L.mapbox.map('map', map_embed_id, { 
     zoomAnimation: false 
    }); 

    // create marker of address entered 
    L.mapbox.featureLayer({ 
     type: 'Feature', 
     geometry: { 
      type: 'Point', 
      coordinates: [ 
       geocode.location.lng, 
       geocode.location.lat 
      ] 
     }, 
     properties: { 
      title: address, 
      'marker-size': 'medium', 
      'marker-color': '#f44', 
      'marker-symbol': 'star' 
     } 
    }).addTo(map); 

    // create polygon layer and add to map from map's geojson 
    var polygonLayer = L.mapbox.featureLayer().loadURL('https://a.tiles.mapbox.com/v4/' + map_embed_id + '/features.json?access_token=pk.eyJ1IjoiZW5nbGVzaWRldGVycml0b3JpZXMiLCJhIjoiekFIU0NlayJ9.rE9XdicgXc9aIiXJ9yn68w').addTo(map); 

    // after polygon layer has been added to map 
    polygonLayer.on('ready', function() { 

     // featureLayer.getBounds() returns the corners of the furthest-out markers, 
     // and map.fitBounds() makes sure that the map contains these. 
     map.fitBounds(polygonLayer.getBounds()); 

     // create a latLng object based on lat/lng of address entered 
     var latlng = L.latLng(geocode.location.lat, geocode.location.lng); 

     // create point in layer object 
     var layer = leafletPip.pointInLayer(latlng, polygonLayer, true); 

     if (layer.length) { 
      // found it 
      return false; 
     } else { 
      if (maps.length > 0) { 
       getMapboxMap(maps, geocode); 
      } 
     } 
    }); 
} 

function getMapsList() { 
    return $.get('/utility/territories/maps-list'); 
}