钛合金:从不同的控制器访问UI?

Dav*_*vid 6 titanium appcelerator

我似乎无法更新Titanium Appcelerator Alloy中的对象,

我基本上希望能够将一个表行添加到一个表中,该表位于我当前所处的不同控制器/视图中......希望下面将更好地描述这个:s

basket.xml

<Alloy>
    <Window id="basketWindow" class="container">
        <TableView id="basketTable" />
        <Button id="addItemButton" onClick="addItem">Add Item</Button>
    </Window>
</Alloy>
Run Code Online (Sandbox Code Playgroud)

basket.js

function addItem()
{
    var itemList = Alloy.createController('item_list');

    itemList.getView().open();
}
Run Code Online (Sandbox Code Playgroud)

item_list.xml

<Alloy>
    <Window id="itemListWindow" class="container">
        <TableView id="itemListTable">
            <TableViewRow id="item1" className="item" onClick="addItemToBasket">
                Test Item
            </TableViewRow>
        </TableView>
    </Window>
</Alloy>
Run Code Online (Sandbox Code Playgroud)

item_list.js

function addItemToBasket()
{
    var row = Ti.UI.createTableViewRow({title: 'Test Item'});

    // Here i would ideally want to put something like $.basketTable.append(row);
    // But nothing happens, im guessing it cant find $.basketTable as its in a different controller?

}
Run Code Online (Sandbox Code Playgroud)

有谁知道这个吗?

谢谢阅读 :)

Jos*_*ter 7

一个简单易用的解决方案是在向篮子中添加项目时触发应用程序范围的事件:

function addItemToBasket() {
    Ti.App.fireEvent("app:itemAddedToBasket", {
       title : "Test Item", 
       otherAttribute : "Value"
    });
}
Run Code Online (Sandbox Code Playgroud)

然后在某处的篮控制器中监听事件,并添加表行:

// inside basket.js
Ti.App.addEventListener("app:itemAddedToBasket", function(e) {
    // object 'e' has all the row information we need to create the row
    var row = Ti.UI.createTableViewRow({
        title: e.title, 
        otherAttribute: e.otherAttribute
    });
    // Now append it to the table
    $.basketTable.append(row);
});
Run Code Online (Sandbox Code Playgroud)