在Android for Titanium

时间:2016-02-15 10:18:32

标签: appcelerator appcelerator-titanium

对于android和ios,我们使用来自serviceutility.js的相同的restful Web服务代码。但是服务受到了冲击,只能在ios中检索值。相同的代码在android中不起作用,我们收到以下错误:

  

[错误]:TiExceptionHandler :(主要)[2,821093] - 合金/控制器/ home.js:25,32

     

[ERROR]:TiExceptionHandler :( main)[0,821093] - 消息:未捕获的TypeError:无法读取属性' status'为null

     

[ERROR]:TiExceptionHandler :( main)[0,821093] - 来源:if(" 1" == response.status)alert(response.message);否则如果(" 0"

     

[错误]:V8异常:合金/ controllers / home.js发生异常:25:未捕获TypeError:无法读取属性' status' null。

Titanium SDK是5.1.2 GA

exports.login = function(user, cb) {
var response = null;
if (Ti.Network.online) {
    var xhr = Ti.Network.createHTTPClient({
        timeout : 10000,
        validatesSecureCertificate : false
    });
    xhr.onload = function() {// Onload
        var responseTxt = this.responseText == '' ? '{}' : this.responseText;
        try {
            response = JSON.parse(responseTxt);
            cb(response, 'SUCCESS');
        } catch(e) {
            cb(response, 'ERROR');
        }
    };
    xhr.onerror = function(e) {
        if (xhr.status === 0) {
            cb(response, 'TIMEDOUT');
        } else {
            cb(response, 'ERROR');
        }
    };
    url = "https://";
    var postData = {
        employeeId : user.employeeId,
        password : user.password
    };
    xhr.open('POST', url);
    xhr.setTimeout(10000);
    xhr.setRequestHeader('employeeId', user.employeeId);
    xhr.setRequestHeader('password', user.password);
    xhr.send();} else {
            cb(response, 'NO_NETWORK');
}};

以下代码适用于index.js文件,其中实际检索值。

if (Ti.Network.online) {
        loginUtil.login(user, function(response, status) {
            Ti.API.info("status----" + status);
            if (response.status == "0") {
                Ti.API.info("status== " + response.status);
                Ti.App.role = response.role;
                Alloy.createController('home',  {employeeId:$.userTextField.value,password:$.passwordTextField.value,from:"index"}).getView().open();

            } else if (response.status == '1') {

                alert(response.message);

            } else {

                alert("Please enter the correct credentials");
            }
        });
    }

请帮助我们。

3 个答案:

答案 0 :(得分:1)

看起来你只返回一个字符串值而不是整个响应对象。然后在您的控制器中,您尝试访问响应对象的.status属性。

//this line returns the string responseTxt
response = JSON.parse(responseTxt);

尝试返回整个响应对象。

response = JSON.parse(this);

然后在index.js控制器中使用/显示状态属性

alert(response.status);

答案 1 :(得分:0)

您的index.js预期response是一个对象,但这只是您拨打callback的情况:

        response = JSON.parse(responseTxt);
        cb(response, 'SUCCESS');

您致电callback response变量null的所有其他地方都是[RegularExpression("(True|true)")] public bool TermsAndConditions { get; set; } ,因为这是您在第二行初始化的地方。

答案 2 :(得分:0)

你的回调会返回两个参数:response&状态,第二个参数从未使用过。

通过阅读登录功能代码,您只能访问响应对象,如果状态=="成功"

if(status === "SUCCESS"){
    if (response.status == "0") {
            Ti.API.info("status== " + response.status);
            Ti.App.role = response.role;
            Alloy.createController('home',  {employeeId:$.userTextField.value,password:$.passwordTextField.value,from:"index"}).getView().open();

    } else if (response.status == '1') {

            alert(response.message);

    } else {

            alert("Please enter the correct credentials");
    }
}
else {
    alert("whoops, please try again !"); // a more generic message.
}