Alloy控制器之间传递的Backbone Model对象具有null属性

时间:2014-01-23 11:55:07

标签: titanium titanium-alloy backbone-model

昨天我开始使用钛,我正在使用'创建你的第一个钛应用'教程(this one)。

当它点击一行并且它打开另一个视图时,我的参数值为null。这是我的代码:

Bookdetails.js

var args = arguments[0] || {};
$.titleLabel.text = args.Title || 'Default Title';
$.authorLabel.text = args.Author || 'Default Author';

index.js

var myBooks = Alloy.Collections.Books;
var myBook = Alloy.createModel('Books', {Title:'Bleach',Author: 'Kubo Tite'});

myBooks.add(myBook);
myBook.save();

function showBook(event){
    var selectedBook = event.source;
    var args = {'Title': selectedBook.Title, 'Author': selectedBook.Author};    
    var bookDetails = Alloy.createController("Bookdetails",args).getView();
    bookDetails.open();
}

$.index.open();

Bookdetails.xml

<Alloy>
    <Window class="container">
        <Label id="titleLabel"></Label>
      <Label id="authorLabel"></Label> 
    </Window>
</Alloy>

我的书籍(模特)定义:

exports.definition = {
    config: {
        columns: {
            "Title": "text",
            "Author": "text"
        },
        adapter: {
            type: "sql",
            collection_name: "Books"
        }
    },
    extendModel: function(Model) {
        _.extend(Model.prototype, {
            // extended functions and properties go here
        });

        return Model;
    },
    extendCollection: function(Collection) {
        _.extend(Collection.prototype, {
            // extended functions and properties go here
        });

        return Collection;
    }
};

INDEX.XML

<Alloy>
    <Collection src="Books" />
    <Window class="container">

        <TableView dataCollection="Books">
            <TableViewRow onClick="showBook" title="{Title}"></TableViewRow>
        </TableView>

        <Menu id="menu" platform="android">
            <MenuItem id="addBooks" title="Adicionar" onClick="callAddBook"  showAsAction="Ti.Android.SHOW_AS_ACTION_IF_ROOM" />
        </Menu>

    </Window>
</Alloy>

当我运行我的应用程序时,它会显示“默认作者”和“默认标题”。我在android(samsung s3)上运行应用程序

1 个答案:

答案 0 :(得分:3)

当您在event.source中处理由TableView触发的事件时,您不会获得用于为该行生成但仅为Titanium.UI.TableViewRow对象生成的Backbone对象。

当您在TableView(check documentation上操作以查看差异)时,最好还是访问event.row而不是event.source

要使此示例正常工作,只需将showBook函数更改为:

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();
}

此外,您可以发送未经修改的Backbone Model对象,以便更轻松地对其进行任何进一步修改,而不是创建新的args对象并将其发送到Bookdetails控制器:

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';