数据返回为"未定义"在钛

时间:2014-09-02 22:20:14

标签: php mysql xampp titanium-mobile

我正在使用以下方式开发适用于iPhone的基本身份验证移动应用程序:

Titanium v​​.3.23

XAMPP作为我的本地服务器和PHP

MySQL作为本地数据库

我正在处理的应用程序基于以下教程:

http://code.tutsplus.com/tutorials/titanium-user-authentication-part-1--mobile-3728

我能够从教程中获取代码并运行没有问题,应用程序允许我将用户名/密码密钥发布到我的本地数据库,使用密钥登录,并在我的主窗口上显示信息

我开始操纵代码以反映我正在尝试构建的更多内容,一个基于窗口的应用程序(不像教程中的基于选项卡),这将允许我创建用户名/密码密钥,登录到主窗口,并在该主窗口上显示我的信息。

我已经成功修改了代码,允许我在本地数据库中创建一个新的用户名/密码,并让应用程序在登录时验证用户名/密码是否匹配。但是,当我登录主屏幕时,它显示我的用户名和密码是"未定义"。为了检查错误,我在当前持有工作代码的项目中输入了相同的用户/传递,并且它是可见的。所以我知道我当前的PHP和数据库都正常工作。

目前,我的app.js是:

setTimeout (function() {

var login;
login = require ('login');
login.LogIn();

var mainWin = Titanium.UI.createWindow();

Ti.App.addEventListener('grantEntrance', function(event){

mainWin.title = 'Welcome ' + event.name;
mainWin.url = 'main.js';
mainWin.name = event.name;
mainWin.email = event.email;

});

}, 2000);

setTimeout函数最终是一个启动画面,我从上面的教程中独立添加。我也改变了#34; main"项目反映我的mainWin,而不是" main"如教程中所示。

目前,我的login.js是:

function LogIn(){

var loginWin = Ti.UI.createWindow({
    backgroundColor:'white'
});

var username = Titanium.UI.createTextField({
color:'#336699',
top:10,
left:10,
width:300,
height:40,
hintText:'Username',
keyboardType:Titanium.UI.KEYBOARD_DEFAULT,
returnKeyType:Titanium.UI.RETURNKEY_DEFAULT,
borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED
});
loginWin.add(username);

var password = Titanium.UI.createTextField({
color:'#336699',
top:60,
left:10,
width:300,
height:40,
hintText:'Password',
passwordMask:true,
keyboardType:Titanium.UI.KEYBOARD_DEFAULT,
returnKeyType:Titanium.UI.RETURNKEY_DEFAULT,
borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED
});
loginWin.add(password);

var loginBtn = Titanium.UI.createButton({
title:'Login',
top:110,
width:90,
height:35,
borderRadius:1,
font:{fontFamily:'Arial',fontWeight:'bold',fontSize:14}
});
loginWin.add(loginBtn);

var createLabel = Titanium.UI.createLabel({
text:'Create Profile',
bottom: 25,
left:25
});
loginWin.add(createLabel);

var indicatorWin = Ti.UI.createView({
width: 320,
height: 480,
backgroundColor: '#000000',
opacity: 0.5
});

var acctInd = Ti.UI.createActivityIndicator({
height:50,
width:50,
style: Titanium.UI.createActivityIndicatorStyle.Plain,
top:250,
left:130
});

var actLabel = Titanium.UI.createLabel({
text: 'Checking Login Details',
color: '#FFFFFF',
left:70,
top:200,
height:50

});

indicatorWin.hide();
acctInd.hide();
actLabel.hide():

loginWin.add(indicatorWin);
indicatorWin.add(acctInd);
indicatorWin.add(actLabel);

var loginReq = Titanium.Network.createHTTPClient();

loginReq.onload = function()
{
var json = this.responseText;

var response = JSON.parse(json);

if (response.logged == true)

{
    username.blur();
    password.blur(); 

    Ti.App.fireEvent('grantEntrance', {
        name:response.name,
        email:response.email
    });
    loginWin.close();
        var main;
        main = require ('main');
        main.MainM();
}
else
{
    alert(response.message);
}
};

loginBtn.addEventListener('click',function(e)

{  
if (username.value != '' && password.value != '')

{

    loginReq.open("POST","http://localhost/Tuts/post_auth.php");

    var params = {
        username: username.value,
        password: Ti.Utils.md5HexDigest(password.value)
    };

    loginReq.send(params);

    indicatorWin.show();
    acctInd.show();
    actLabel.show();
}  
else
{
    alert("Username/Password are required");
}
});

createLabel.addEventListener('click', function(e) {
var ProfileWin, ProfileInc;
ProfileInc = require ('createProfile');
ProfileWin = new ProfileInc.CreateP();
ProfileWin.open();
});

loginWin.open();
return ;loginWin;
}
exports.LogIn=LogIn;

目前,我的main.js是:

function MainM(){

var mainWin = Ti.UI.createWindow({
backgroundColor:'white'
});

var msg = Titanium.UI.createLabel({
text:"\n\nYour email is:\n" + mainWin.email + "\n\nyour name is:\n" + mainWin.name,
top:10,
left:10,
width:300,
height:'auto'
});
mainWin.add(msg);

mainWin.open();
return ;mainWin;
}
exports.MainM=MainM;

正如您所看到的,我对应用程序的实际数据库部分没有太大的改变。这就是为什么我感到困惑,因为它不起作用。我发现的唯一研究表明异步请求可能存在问题,并且听说通过使用setTimeout函数我可能能够解决我的错误。我试图在几个地方插入该功能,但错误仍然存​​在。

很抱歉这么久,我已经为此工作了一个月,我希望尽可能详细。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在您的代码中,主屏幕是一个新窗口,它无法访问变量电子邮件和名称。

在min win中获取值的方法是将它们保存在Properties并使用它们,或者修改你的main.js。