2016-10-02 6 views
0

Недавно я использовал титан и сплав для разработки приложения для Android. Теперь я пытаюсь (в первый раз) сортировать привязанную базовую коллекцию по расстоянию с помощью функции компаратора, но она не работает.Сортировка по расстоянию с моделями из титанового сплава

comparator: function(game) { 
    var lon1, lat1, lat2, lon2; 
    if (Ti.Geolocation.locationServicesEnabled) { 
     Ti.Geolocation.getCurrentPosition(function(e) { 
      if (e.error) { 
       Ti.API.error('Error:' + e.error); 
       return 0; 
      } else { 
       Ti.API.info(e.coords); 

       lon1 = e.coords.longitude; 
       lat1 = e.coords.latitude; 

       Titanium.Geolocation.forwardGeocoder(game.get("camp"), function(e) { 
        if (e.success) { 
         lat2 = e.latitude; 
         lon2 = e.longitude; 

         var R = 6371; // km 
         var dLat = (lat2 - lat1) * Math.PI/180; 
         var dLon = (lon2 - lon1) * Math.PI/180; 
         var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
          Math.cos(lat1 * Math.PI/180) * Math.cos(lat2 * Math.PI/180) * 
          Math.sin(dLon/2) * Math.sin(dLon/2); 
         var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
         var d = R * c; 

         console.log("KM: " + parseInt(d)); 

         return parseInt(d); 
        } else { 
         console.log("Unable to find address"); 

         return 0; 
        } 
       }); 
      } 
     }); 
    } else { 
     console.log('please enable location services') 

     return 0; 
    } 
} 

В мой контроллер, я использую:

var games = Alloy.Collections.allGames; 
games.sort(); 
games.fetch(); 

Можете ли вы сказать мне, что случилось?

ответ

1

Я не использую ни титан, ни сплав, но я могу понять, почему ваша функция компаратора не будет работать.

коллекции Backbone в comparator недвижимость

Во-первых, чтобы понять, почему это не работает, вы должны понимать, что comparator собственность коллекции, в том, что доступно и как реализовать один.

Существует (по крайней мере) 3 вида стоимости, которую может получить имущество comparator коллекции.

  • Имя атрибута в виде строки

    comparator: 'fieldName' 
    
  • sortBy функция, которая принимает один аргумент

    comparator: function(model) { 
        // return a numeric or string value by which the model 
        // should be ordered relative to others. 
        return Math.sin(model.get('myNumber')); 
    } 
    
  • sort функция, которая принимает два аргумента

    comparator: compare(modelA, modelB) { 
        var field = 'myNumber', 
         numA = modelA.get(field), 
         numB = modelB.get(field); 
        if (numA < numB) { 
         return -1; 
        } 
        if (numA > numB) { 
         return 1; 
        } 
        // a must be equal to b 
        return 0; 
    } 
    

Почему у вас не получается?

Короткий ответ: он всегда возвращает undefined или 0 в зависимости от значения Ti.Geolocation.locationServicesEnabled.

Вы сделали запутанную функцию для сортировки модели, в которых вы используете асинхронные функции (getCurrentPosition, forwardGeocoder) и вы кладете всю логику внутри обратных вызовов, которые оцениваются, когда коллекция уже закончена сортировка.

+1

Понимаю, много! – Luca4k4

Смежные вопросы