2013-04-17 59 views
6

我似乎有在Appcelerator的鈦鋁合金麻煩更新對象,鈦合金:從不同的控制器訪問用戶界面?

我基本上要能夠錶行添加到表是在不同的控制器/認爲我目前在.... 。希望下面將更好地描述這個:■

basket.xml

<Alloy> 
    <Window id="basketWindow" class="container"> 
     <TableView id="basketTable" /> 
     <Button id="addItemButton" onClick="addItem">Add Item</Button> 
    </Window> 
</Alloy> 

basket.js

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

    itemList.getView().open(); 
} 

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> 

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? 

} 

有誰知道遠解決此問題?

感謝您的閱讀:)

回答

7

一個簡單的,簡單的辦法是,當你添加項目到籃下只是觸發一個應用廣泛的事件:

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

後來聽在籃下事件控制器添加表格行:

// 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); 
}); 
+0

太棒了!非常感謝Josiah,完美的作品:) – David

+0

我喜歡這個答案,但我也很好奇這樣做的更「模型 - 視圖 - 控制器」的方式。假設「籃子」是一個模型或集合,我希望自動與服務器同步。應用程序級別的事件仍然是一個好的解決方案嗎? – Brad

+0

應用程序級別事件可能會觸發「模型」發生更改的全局同步事件,這會逐漸下降,通知每個控制器模型已更改,然後更新其視圖。所以一些相同的概念適用。雖然「應用程序級別事件」可能會被籃子集合中的Backbone事件所取代。 –