如何在 Titanium 中操作选项卡式视图并添加 SQLite 内容?

How to manipulate a tabbed view in Titanium and add SQLite content?

The Overview

我是 Titanium 的新手,我决定最终开始使用 SQLite 和一些新的 UI 功能。我选择了 TabGroup,因为我觉得那是最好的选择。但是我有一些问题。我试图简单地获取一些已插入 table 的引号(经过测试和工作,我提醒他们并且它有效)并且我希望将它们显示在 wiseWords 选项卡中,以便用户可以查看它们.

The Code

index.xml

<Alloy id="index">
    <TabGroup>
        <Require src="home"></Require>
        <Require src="wiseWords"></Require>
        <Require src="settings"></Require>
    </TabGroup>
</Alloy>

index.js

$.index.open(); 

/** Create and populate the wise words table. **/
Alloy.Globals.createRequiredTables();

var selectWiseWordsSQL = "SELECT * FROM wise_words";
var selectWiseWords = Titanium.App.db.execute(selectWiseWordsSQL);

while (selectWiseWords.isValidRow()) {
    /** Create labels for each quote. **/
    var addQuote = Titanium.UI.createLabel({
        text : selectWiseWords.fieldByName("saying") + " - " + selectWiseWords.fieldByName("quoted_by"),
    });

    /** Add quote to window (available in wiseWords.xml). **/
    $.wiseWordsWindow.add(addQuote);

    selectWiseWords.next();
}
selectWiseWords.close();

wiseWords.xml

<Alloy>
    <Tab id="wiseWordsTab" title="Wise Words">
        <Window id="wiseWordsWindow" class="container" title="Wise Words">  
        </Window>
    </Tab>
</Alloy>

The Error(s)

运行时错误

位置:alloy/controllers/index.js

未捕获类型错误:无法调用未定义的方法 'add'。

来源:$.wiseWordsWindow.add(addQuote);

To Clarify...

我明白错误的含义,但不明白为什么会抛出它。

  1. 为什么我无法在 index.js 中访问 wiseWords.xml 的视图,即使在 index.xml 中通过 <Require> 标记引用了 wiseWords?

Clarification

您正在使用 ID wiseWordsWindow 调用 window 的 add 方法。但是根据您的代码,您在使用 require 的 index.xml 文件中使用了这个控制器。所以你不能直接访问 wiseWords 控制器的元素。所以你可以尝试在可以从索引文件访问的 wiseWords 控制器中创建方法,然后将子添加到 wiseWordsWindow。有两种方法可以做到这一点。

解决方案 1

The Code

index.xml(在此文件中将 id 提供给 wiseWords)

<Alloy id="index">
    <TabGroup>
        <Require src="home"></Require>
        <Require id="wiseWordsWin" src="wiseWords"></Require>
        <Require src="settings"></Require>
    </TabGroup>
</Alloy>

index.js(在此文件中更改方法调用 add 到我们将在 wiseWords 控制器中创建的方法)

$.wiseWordsWindow.add(addQuote); 行更改为以下内容。

$.wiseWordsWin.addQuote(addQuote);

更新代码 index.js

/** Create and populate the wise words table. **/
Alloy.Globals.createRequiredTables();

var selectWiseWordsSQL = "SELECT * FROM wise_words";
var selectWiseWords = Titanium.App.db.execute(selectWiseWordsSQL);

while (selectWiseWords.isValidRow()) {
    /** Create labels for each quote. **/
    var addQuote = Titanium.UI.createLabel({
        text : selectWiseWords.fieldByName("saying") + " - " + selectWiseWords.fieldByName("quoted_by"),
    });

    /** Add quote to window (available in wiseWords.xml). **/
    $.wiseWordsWin.addQuote(addQuote);

    selectWiseWords.next();
}
selectWiseWords.close();
$.index.open();

wiseWords(保持文件原样)

wiseWords.js(在这个controller中添加addQuote方法赋值给我们的controller)

function addQuote(_quote){
    $.wiseWordsWindow.add(_quote);
}
exports.addQuote = addQuote;

解决方案 2

在此解决方案中,index.xml 的代码与第一个解决方案相同。 更改将在 index.js 和 wiseWords.js.

中进行

The Code

wiseWords.js(向该文件添加以下行)

exports.myWiseWordsWin = $.wiseWordsWindow;

index.js(现在我们可以使用为输出 window 创建的引用从索引文件访问我们的 wiseWordsWindow)

$.wiseWordsWindow.add(addQuote); 行更改为以下内容。

$.wiseWordsWin.myWiseWordsWin.add(addQuote);

更新代码 index.js

/** Create and populate the wise words table. **/
Alloy.Globals.createRequiredTables();

var selectWiseWordsSQL = "SELECT * FROM wise_words";
var selectWiseWords = Titanium.App.db.execute(selectWiseWordsSQL);

while (selectWiseWords.isValidRow()) {
    /** Create labels for each quote. **/
    var addQuote = Titanium.UI.createLabel({
        text : selectWiseWords.fieldByName("saying") + " - " + selectWiseWords.fieldByName("quoted_by"),
    });

    /** Add quote to window (available in wiseWords.xml). **/
    $.wiseWordsWin.myWiseWordsWin.add(addQuote);
    selectWiseWords.next();
}
selectWiseWords.close();
$.index.open();

希望这会有所帮助