2013-04-17 16 views
6

Ich scheine Schwierigkeiten zu aktualisieren Objekte in Titanium Appcelerator Legierung zu haben,Titanlegierung: Zugriff auf die Benutzeroberfläche von verschiedenen Controllern?

ich in grundsätzlich in der Lage sein will, eine Tabellenzeile in eine Tabelle hinzuzufügen, die in einer anderen Controller/Ansicht ist, dass ich bin zur Zeit .... . hoffentlich unter dem wird dies besser beschreiben: s

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? 

} 

Wer weiß, weg, um dieses?

Danke fürs Lesen :)

Antwort

7

Eine einfache, ist einfache Lösung, um nur eine App weites Ereignis auslösen, wenn Sie ein Element in den Warenkorb legen:

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

Dann in den Korb für die Veranstaltung hören Controller irgendwo, und fügen Sie die Tabellenzeile hinzu:

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

Großartig! Vielen Dank Josiah, funktioniert perfekt :) – David

+0

Ich mag diese Antwort, aber ich bin auch neugierig auf einen mehr "Model-View-Controller" Weg, dies zu tun. Angenommen, 'Basket' war ein Model oder eine Collection und ich möchte automatisch mit einem Server synchronisieren. Wären Ereignisse auf App-Ebene immer noch eine gute Lösung? – Brad

+0

Ein Ereignis auf App-Ebene könnte ein globales Synchronisierungsereignis auslösen, bei dem sich das "Modell" geändert hat. Dies führt dazu, dass jeder Controller, der das Modell geändert hat, informiert wird, und aktualisiert dann seine Ansicht. Daher gelten einige der gleichen Konzepte. Obwohl "Ereignis auf App-Ebene" wahrscheinlich durch ein Backbone-Ereignis in der Basket-Sammlung ersetzt würde. –

Verwandte Themen