Titanium:显示自定义对象 - 变量undefined

时间:2013-12-04 23:54:40

标签: javascript android titanium cloud titanium-mobile

我是Titanium和Web开发的新手。我正在尝试检索我创建并存储在ACS上的自定义对象。我花了几个小时就陷入困境,因为我不知道如何从云中正确检索一组数据字段。我的代码编译,但表视图没有显示。我只看到标题和后退按钮。我相信错误在“Cloud.Objects.Query”块中(它应该显示4个条目,每个条目都有日期,地点和评论),但我没有看到它们中的任何一个。我尝试使用警报,其中一条警告消息是“变量未定义”。有人可以看看并给我一些提示吗?谢谢你的时间。

    //Import the module
var Cloud = require('ti.cloud');
Cloud.debug = true;  // optional; if you add this line, set it to false for production 

// this sets the background color of the master UIView (when there are no windows/tab groups on it)
Titanium.UI.setBackgroundColor('#000');

exports.getDiaryWin = function() {

    //create window
    var diary_window = Titanium.UI.createWindow({
        backgroundColor:'#FFF',
        title: "Travel Diary"
    });

    //create title
    var title = Titanium.UI.createLabel({
        text: "My Travel Diary",
        top:10,
        color: '#008000',
        textAlign: 'center',
        font: {fontSize:55}
    });

    var tableView = Ti.UI.createTableView({
        top: '10%',
        scrollable: true,
        width: '100%',
        minRowHeight: '50',
        bottom: '10%'
    });

    //Get diary entries, add them to the table view and display it  
    var idList = [];
    var tableData = [];
    var displayData = [];
    var entry;

    //Get diary id 
    Cloud.Objects.query({
        classname: 'diaries',
        page: 1,
        per_page: 10
    },function(e){
        if (e.success){
            alert('Count: '+e.diaries.length);

        for (var i=0; i<e.diaries.length; i++)
            {
                entry = e.diaries[i];
                /*
                alert('id: ' + entry.id + '\n' +
                'date: ' + entry.date + '\n' +
                'place: ' + entry.place + '\n' +
                'review: ' + entry.review + '\n' +
                'created_at: ' + entry.created_at);
                */
                tableData.push({
                    date: entry.date,
                    place: entry.place,
                    review: entry.review
                });

                alert('tableData:' + tableData.date);   //ALERT: tableData: UNDEFINED

            }   
        } else {
            alert('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
        }   
    });


    /*
    tableData.push({
        date: 'Can u see this?'
    });
    */

    for (var i=0; i < tableData.length; i++){
        var row = Ti.UI.createTableViewRow({
            height:150,
            backgroundColor : '#FF9900',
            font: {fontSize:35},
            title: tableData[i].date
        });

        /*
        var dateField = Ti.UI.createLabel({
            text:tableData[i].date,
            font: {fontSize:35}, 
            color:'#888', 
            left:5, 
            width:Ti.UI.FILL
        });
        row.add(dateLabel);

        var placeLabel = Ti.UI.createLabel({
            text:tableData[i].place,
            font: {fontSize:35}, 
            color:'#888', left:5, width:Ti.UI.FILL
        });
        row.add(placeLabel);

        var reviewLabel = Ti.UI.createLabel({
            text:tableData[i].review,
            font: {fontSize:35}, 
            color:'#888', 
            left:5, 
            width:Ti.UI.FILL
        });
        row.add(reviewLabel);
        */
        displayData.push(row);
    }

    tableView.setData(displayData);

    //add a 'back' button
    var back_button = Titanium.UI.createButton({
        title: "Back",  
        buttom:20,
        height:200,
        left:40,
        right:40    
    });     

    //Add Event Listener
    back_button.addEventListener('click', function(){
        //call an export function
        var win = require('home').getHomeWin;

        //create new instance
        var nextWin = new win();
        nextWin.open();
    });


    diary_window.add(title);
    diary_window.add(tableView);
    diary_window.add(back_button);
    return diary_window;

};

------------ EDITED CODE --------------

//Import the module
var Cloud = require('ti.cloud');
Cloud.debug = true;  // optional; if you add this line, set it to false for production 

// this sets the background color of the master UIView (when there are no windows/tab groups on it)
Titanium.UI.setBackgroundColor('#000');

exports.getDiaryWin = function() {

    //create window
    var diary_window = Titanium.UI.createWindow({
        backgroundColor:'#FFF',
        title: "Travel Diary"
    });

    //create title
    var title = Titanium.UI.createLabel({
        text: "My Travel Diary",
        top:10,
        color: '#008000',
        textAlign: 'center',
        font: {fontSize:55}
    });

    var tableView = Ti.UI.createTableView({
        top: '10%',
        scrollable: true,
        width: '100%',
        minRowHeight: '50',
        bottom: '10%'
    });

    //Get diary entries, add them to the table view and display it  
    var idList = [];
    var tableData = [];
    var displayData = [];
    var entry;

    //Get diary id 
    Cloud.Objects.query({
       classname: 'diaries',
       page: 1,
       per_page: 10
    }, function(e) {
        var row, dateLabel, placeLabel, reviewLabel;
        var displayData = [];

        if (e.success){    
            alert('Count: '+e.diaries.length);

            for (var i=0; i<e.diaries.length; i++) {
                entry = e.diaries[i];
                row = Ti.UI.createTableViewRow({
                    height:150,
                    backgroundColor : '#FF9900',
                    font: {fontSize:35},
                    title: entry.date
                });

                dateLabel = Ti.UI.createLabel({
                    text: entry.date,
                    font: {fontSize:35}, 
                    color:'#888', 
                    left:5, 
                    width:Ti.UI.FILL
                });
                row.add(dateLabel);

                placeLabel = Ti.UI.createLabel({
                    text: entry.place,
                    font: {fontSize:35}, 
                    color:'#888', left:5, width:Ti.UI.FILL
                });
                row.add(placeLabel);

                reviewLabel = Ti.UI.createLabel({
                    text: entry.review,
                    font: {fontSize:35}, 
                    color:'#888', 
                    left:5, 
                    width:Ti.UI.FILL
                });
                row.add(reviewLabel);

                displayData.push(row);
            }

            tableView.setData(displayData);
        } else {
            alert('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
        }   
    });

    //add a 'back' button
    var back_button = Titanium.UI.createButton({
        title: "Back",  
        buttom:20,
        height:200,
        left:40,
        right:40    
    });     

    //Add Event Listener
    back_button.addEventListener('click', function(){
        //call an export function
        var win = require('home').getHomeWin;

        //create new instance
        var nextWin = new win();
        nextWin.open();
    });


    diary_window.add(title);
    diary_window.add(tableView);
    diary_window.add(back_button);
    return diary_window;

};

1 个答案:

答案 0 :(得分:1)

alert('tableData:' + tableData.date);上触发错误“变量未定义”,因为您试图访问整个数组上的日期属性而不是存储在数组中的对象之一。将其更改为,例如:

alert('tableData:' + tableData[0].date);

你还应该在回调中移动整个for循环。您必须等待Cloud API的响应才能开始填充TableView:

Cloud.Objects.query({
       classname: 'diaries',
       page: 1,
       per_page: 10
}, function(e) {
    var row, dateField, placeLabel, reviewLabel;
    var displayData = [];

    if (e.success){    
        alert('Count: '+e.diaries.length);

        for (var i=0; i<e.diaries.length; i++) {
            entry = e.diaries[i];
            row = Ti.UI.createTableViewRow({
                height:150,
                backgroundColor : '#FF9900',
                font: {fontSize:35},
                title: entry.date
            });

            dateField = Ti.UI.createLabel({
                text: entry.date,
                font: {fontSize:35}, 
                color:'#888', 
                left:5, 
                width:Ti.UI.FILL
            });
            row.add(dateLabel);

            placeLabel = Ti.UI.createLabel({
                text: entry.place,
                font: {fontSize:35}, 
                color:'#888', left:5, width:Ti.UI.FILL
            });
            row.add(placeLabel);

            reviewLabel = Ti.UI.createLabel({
                text: entry.review,
                font: {fontSize:35}, 
                color:'#888', 
                left:5, 
                width:Ti.UI.FILL
            });
            row.add(reviewLabel);

            displayData.push(row);
        }

        tableView.setData(displayData);
    } else {
        alert('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
    }   
});