2013-04-17 38 views
6

Tôi dường như đang gặp sự cố khi cập nhật các đối tượng trong Hợp kim Titanium Appcelerator,Hợp kim Titan: Truy cập giao diện người dùng từ các bộ điều khiển khác nhau?

Tôi về cơ bản muốn có thể thêm hàng trong bảng vào một bộ điều khiển/chế độ xem khác mà tôi hiện đang ở .... . hy vọng dưới đây sẽ mô tả tốt hơn này: 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? 

} 

Có ai biết đi xung quanh này?

Cảm ơn bạn đã đọc :)

Trả lời

7

Một đơn giản, dễ giải pháp là chỉ cần kích hoạt một sự kiện rộng ứng dụng khi bạn thêm một mục vào giỏ:

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

Sau đó, lắng nghe cho sự kiện trong giỏ điều khiển ở đâu đó và thêm hàng của bảng:

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

Tuyệt vời! cảm ơn rất nhiều Josiah, hoạt động hoàn hảo :) – David

+0

Tôi thích câu trả lời này, nhưng tôi cũng tò mò là một cách "Model-View-Controller" hơn để làm điều này. Giả sử 'Basket' là một Model hoặc một Collection và tôi muốn đồng bộ tự động với một máy chủ. Các sự kiện cấp ứng dụng sẽ vẫn là một giải pháp tốt? – Brad

+0

Sự kiện cấp ứng dụng có thể kích hoạt sự kiện đồng bộ hóa toàn cầu mà "mô hình" đã thay đổi, điều này sẽ thông báo cho từng bộ điều khiển mà mô hình đã thay đổi và sau đó cập nhật chế độ xem của nó. Vì vậy, một số khái niệm tương tự áp dụng. Mặc dù "sự kiện cấp ứng dụng" có thể được thay thế bằng sự kiện Backbone trong bộ sưu tập giỏ. –

Các vấn đề liên quan