【问题标题】:Titanium: Display Custom Object - variable undefinedTitanium:显示自定义对象 - 变量未定义
【发布时间】:2013-12-04 23:54:40
【问题描述】:

我是 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;

};

------------编辑的代码 --------------

//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;

};

【问题讨论】:

  • 能否粘贴完整的错误消息,包括出现的行号?
  • @daniula:很抱歉造成混乱。我不确定这是否真的是一条错误消息。它来自 Cloud.Objects.Query 块中的警报之一 (alert('tableData:' + tableData.date);)。
  • 好的,现在我知道发生了什么。在下面检查我的答案:)

标签: javascript android titanium cloud titanium-mobile


【解决方案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)));
    }   
});

【讨论】:

  • 感谢您的提示!我刚试过你的建议。它可以编译,但我仍然没有在应用程序上看到日期、地点和评论。我只看到标题和后退按钮。 =( 我将我的新代码添加到我的帖子中(在“编辑的代码”下)。你介意看看并给我更多提示吗?
  • 查询是否成功完成?您应该收到警报消息:alert('Count: '+e.diaries.length);
  • 是的,我收到了警报消息(输出:计数:4)。
  • 您的代码有效!抱歉,我将正确的代码移到了另一个文件中。 ^____^...非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多