如何将变量从库传递到 Appcelerator/Titanium 中的控制器?
How to pass variables from a library to a controller in Appcelerator/Titanium?
我正在尝试将地理定位功能(获取纬度和经度)放入库中,return 纬度和经度因为整个应用程序都会调用坐标。我可以从 controller.js 调用地理库,纬度和经度显示在控制台中,但是 如何在 [=24= 的调用函数中使用坐标 ]?
在app/lib/geo.js
exports.getLongLat = function checkLocation(){
if (Ti.Geolocation.locationServicesEnabled) {
Titanium.Geolocation.getCurrentPosition(function(e) {
if (e.error) {
Ti.API.error('Error: ' + e.error);
} else {
Ti.API.info(e.coords);
var latitude = e.coords.latitude;
var longitude = e.coords.longitude;
console.log("lat: " + latitude + " long: " + longitude);
}
});
} else {
console.log('location not enabled');
}
};
controller.js
geolocation.getLongLat(); //this calls the library, but I don't know how I can get the coordinates "back" into the controller.js file for using it in the var args below.
var args ="?display_id=check_if_in_dp_mobile&args[0]=" + lat + "," + lon;
为此创建一个可重用的库是个好主意,而且您走在正确的道路上。 getCurrentPosition
的挑战在于它是异步的,因此我们必须以稍微不同的方式从中获取数据。
注意 geo.js 行 Titanium.Geolocation.getCurrentPosition(function(e) {...
,有一个函数被传递给 getCurrentPosition
。这是一个 回调 函数,在 phone 收到位置数据后执行。这是因为 getCurrentPosition
是异步的,这意味着该回调函数中的代码要到稍后的某个时间点才会执行。我有一些关于异步回调的笔记 here.
对于您的 getLongLat 函数,我们需要做的主要事情是将回调传递给它,该回调又可以传递给 getCurrentPosition。像这样:
exports.getLongLat = function checkLocation(callback){
if (Ti.Geolocation.locationServicesEnabled) {
//we are passing the callback argument that was sent from getLongLat
Titanium.Geolocation.getCurrentPosition(callback);
} else {
console.log('location not enabled');
}
};
然后当你执行这个函数的时候,你将回调传递给它:
//we moved our callback function here to the controller where we call getLongLat
geolocation.getLongLat(function (e) {
if (e.error) {
Ti.API.error('Error: ' + e.error);
} else {
Ti.API.info(e.coords);
var latitude = e.coords.latitude;
var longitude = e.coords.longitude;
console.log("lat: " + latitude + " long: " + longitude);
}
});
在这种情况下,我们基本上是将最初传递给 getCurrentPosition
的函数的内容移到您在控制器中调用 getLongLat
的地方。现在您将能够在回调执行时对坐标数据执行某些操作。
Titanium 应用程序中发生回调的另一个地方是使用 Ti.Network.HttpClient
发出网络请求。 Here 是一个类似的示例,说明您仅通过发出 HTTPClient 请求为您的地理位置查询构建一个库。
我正在尝试将地理定位功能(获取纬度和经度)放入库中,return 纬度和经度因为整个应用程序都会调用坐标。我可以从 controller.js 调用地理库,纬度和经度显示在控制台中,但是 如何在 [=24= 的调用函数中使用坐标 ]?
在app/lib/geo.js
exports.getLongLat = function checkLocation(){
if (Ti.Geolocation.locationServicesEnabled) {
Titanium.Geolocation.getCurrentPosition(function(e) {
if (e.error) {
Ti.API.error('Error: ' + e.error);
} else {
Ti.API.info(e.coords);
var latitude = e.coords.latitude;
var longitude = e.coords.longitude;
console.log("lat: " + latitude + " long: " + longitude);
}
});
} else {
console.log('location not enabled');
}
};
controller.js
geolocation.getLongLat(); //this calls the library, but I don't know how I can get the coordinates "back" into the controller.js file for using it in the var args below.
var args ="?display_id=check_if_in_dp_mobile&args[0]=" + lat + "," + lon;
为此创建一个可重用的库是个好主意,而且您走在正确的道路上。 getCurrentPosition
的挑战在于它是异步的,因此我们必须以稍微不同的方式从中获取数据。
注意 geo.js 行 Titanium.Geolocation.getCurrentPosition(function(e) {...
,有一个函数被传递给 getCurrentPosition
。这是一个 回调 函数,在 phone 收到位置数据后执行。这是因为 getCurrentPosition
是异步的,这意味着该回调函数中的代码要到稍后的某个时间点才会执行。我有一些关于异步回调的笔记 here.
对于您的 getLongLat 函数,我们需要做的主要事情是将回调传递给它,该回调又可以传递给 getCurrentPosition。像这样:
exports.getLongLat = function checkLocation(callback){
if (Ti.Geolocation.locationServicesEnabled) {
//we are passing the callback argument that was sent from getLongLat
Titanium.Geolocation.getCurrentPosition(callback);
} else {
console.log('location not enabled');
}
};
然后当你执行这个函数的时候,你将回调传递给它:
//we moved our callback function here to the controller where we call getLongLat
geolocation.getLongLat(function (e) {
if (e.error) {
Ti.API.error('Error: ' + e.error);
} else {
Ti.API.info(e.coords);
var latitude = e.coords.latitude;
var longitude = e.coords.longitude;
console.log("lat: " + latitude + " long: " + longitude);
}
});
在这种情况下,我们基本上是将最初传递给 getCurrentPosition
的函数的内容移到您在控制器中调用 getLongLat
的地方。现在您将能够在回调执行时对坐标数据执行某些操作。
Titanium 应用程序中发生回调的另一个地方是使用 Ti.Network.HttpClient
发出网络请求。 Here 是一个类似的示例,说明您仅通过发出 HTTPClient 请求为您的地理位置查询构建一个库。