使用 Titanium alloy 模型按距离排序
Sorting by distance with Titanium alloy models
我最近使用 Titanium 和 Alloy 开发了一个 android 应用程序。现在我正在尝试(第一次)使用比较器函数按距离对绑定的 backbone 集合进行排序,但它不起作用。
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();
你能告诉我哪里出了问题吗?
我既不使用 Titanium 也不使用 Alloy,但我明白为什么你的比较器功能不起作用。
Backbonecollection的comparator
属性
首先,要了解它为什么不起作用,您需要了解 collection 的 comparator
属性 是什么,可用的是什么以及如何实现。
collection 的 comparator
属性 可以取(至少)3 种类型的值。
字符串形式的属性名称
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;
}
为什么你的失败了?
简短的回答:它只会 returns undefined
或 0
取决于 Ti.Geolocation.locationServicesEnabled
.
的值
你做了一个复杂的函数来对你的模型进行排序,你在其中使用了异步函数(getCurrentPosition
,forwardGeocoder
),你把所有的逻辑都放在回调中,当 collection已经完成排序。
我最近使用 Titanium 和 Alloy 开发了一个 android 应用程序。现在我正在尝试(第一次)使用比较器函数按距离对绑定的 backbone 集合进行排序,但它不起作用。
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();
你能告诉我哪里出了问题吗?
我既不使用 Titanium 也不使用 Alloy,但我明白为什么你的比较器功能不起作用。
Backbonecollection的comparator
属性
首先,要了解它为什么不起作用,您需要了解 collection 的 comparator
属性 是什么,可用的是什么以及如何实现。
collection 的 comparator
属性 可以取(至少)3 种类型的值。
字符串形式的属性名称
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; }
为什么你的失败了?
简短的回答:它只会 returns undefined
或 0
取决于 Ti.Geolocation.locationServicesEnabled
.
你做了一个复杂的函数来对你的模型进行排序,你在其中使用了异步函数(getCurrentPosition
,forwardGeocoder
),你把所有的逻辑都放在回调中,当 collection已经完成排序。