如何将变量从库传递到Appcelerator / Titanium中的控制器?

时间:2017-07-16 14:55:02

标签: controller geolocation appcelerator lib

我正在尝试将地理定位功能(获取纬度和经度)放入库中并返回纬度和经度,因为整个应用程序都会调用坐标。我可以从controller.js调用geo库,lat和long在控制台中显示,但如何在来自controller.js的调用函数中使用坐标

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;

1 个答案:

答案 0 :(得分:1)

为此创建一个可重用的库是个好主意,而且你正走在正确的道路上。 getCurrentPosition的挑战在于它是异步的,因此我们必须以不同的方式从中获取数据。

请注意,在geo.js行Titanium.Geolocation.getCurrentPosition(function(e) {...中,有一个函数被传递给getCurrentPosition。这是一个回调功能,在手机收到位置数据时执行。这是因为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的位置。现在,您可以在回调执行时对coords数据执行某些操作。

Titanium应用程序中发生回调的另一个地方是使用Ti.Network.HttpClient发出网络请求。 Here是一个类似的例子,说明了通过创建HTTPClient请求为地理定位查询构建库的过程。