【问题标题】:How to manipulate a tabbed view in Titanium and add SQLite content?如何在 Titanium 中操作选项卡式视图并添加 SQLite 内容?
【发布时间】:2015-08-02 20:10:47
【问题描述】:

概述

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

守则

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>

错误

运行时错误

位置:alloy/controllers/index.js

未捕获的类型错误:无法调用未定义的方法“添加”。

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

澄清...

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

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

【问题讨论】:

    标签: javascript android xml sqlite titanium


    【解决方案1】:

    澄清

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

    解决方案 1

    守则

    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(在此控制器中添加 addQuote 方法并将其分配给我们的控制器)

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

    解决方案 2

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

    守则

    wiseWords.js(在此文件中添加以下行)

    exports.myWiseWordsWin = $.wiseWordsWindow;
    

    index.js(现在我们可以使用为 out 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();
    

    希望这会有所帮助

    【讨论】:

    • 在您的第一个解决方案中,您说我应该这样做$.wiseWordsWin...,但我不明白它是如何工作的。那个 ID 不是指整个视图,而不仅仅是我在 wiseWords.xml 中的正确 &lt;Window&gt; 标记吗?我想在&lt;Window&gt; 标签中添加任何动态添加的标签。
    • 我已经用更多解释更新了解决方案。你可以参考一下,如果还有什么困惑,请告诉我。我会解释的。
    • 新错误,Uncaught TypeError: Object #&lt;Controller&gt; has no method 'addQuote'. Source $.wiseWordsView.addQuote(addQuote); 这是我尝试解决方案 1 时发生的。
    • 我认为的问题是控制器 index.js 和 wiseWords 没有连接,所以它失败了。任何想法如何连接控制器?
    • 是的。我试过了,出现了一个错误,它找不到我们在 wiseWords.js 中创建的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多