When you are handling event triggered by TableView in event.source you don't get Backbone Object which was used to generate for that row but Titanium.UI.TableViewRow
object.
Also it's better to access event.row
instead of event.source
when you are operating on TableView (check documentation to see difference).
To make this example work just change showBook function to:
function showBook(event){
var selectedBook = myBooks.where({Title: event.row.title})[0];
var args = {'Title': selectedBook.get('Title'), 'Author': selectedBook.get('Author')};
var bookDetails = Alloy.createController("Bookdetails", args).getView();
bookDetails.open();
}
Also instead of creating new args
object and sending it to Bookdetails controller you can send unmodified Backbone Model object to make easier any further modifications on it:
function showBook(event){
var selectedBook = myBooks.where({Title: event.row.title})[0];
var bookDetails = Alloy.createController("Bookdetails", selectedBook).getView();
bookDetails.open();
}
Bookdetails.js
var args = arguments[0] || {};
$.titleLabel.text = args.get('Title') || 'Default Title';
$.authorLabel.text = args.get('Author') || 'Default Author';