Backbone.js单击事件不能始终如一地工作

时间:2011-10-22 09:49:08

标签: jquery ruby-on-rails-3 json backbone.js underscore.js

我正在使用rails api开发一个backbone.js应用程序,它提供了如下所示的json:

{
    "name": "dan brown",
    "genre": "fiction",
    "books": [{
        "title": "Da vinci Code",
        "price": "50"
    },
    {
        "title": "Some other name",
        "price": "45"
    }],

    "name": "Author1",
    "genre": "comedy",
    "books": [{
        "title": "asdfasdfdsf",
        "price": "50"
    },
    {
        "title": "asdfdsf name",
        "price": "45"
    }]
}
  

Todo: 1.显示页面左侧的作者列表。             2.当用户点击作者时,应显示相应的书籍,并带有add_to_cart的链接             3.最后,当用户点击该书时,它应显示有关该书的更多详细信息

进度: 1.我可以使用backbone.js获取作者列表并显示在左侧(authors.fetch())               2.当用户点击时,我能够显示该特定作者的书籍。

问题:现在当用户第一次点击AUTHOR1时,在点击其他作者后,它会显示该作者的书籍,如果用户再次点击同一个Author1没有显示任何书籍。似乎用户Backbone作者模型在点击一次后失去了点击事件....我希望点击事件能够坚持作者......

  

怎么做?

     

在哪里做?

非常感谢任何帮助和建议

在AuthorView

events: {
    "click .author": "select"
},

select: function() {
    this.collection.trigger('select', this.model);
    //console.log(this.model);
}

在BookListView中:

this.collection.bind('add', this.renderBook);

this.book = this.options.book;

this.authors = this.options.authors;
this.authors.bind('select', this.queueBooks);

queueBooks: function(author) {
    this.collection.add(author);
}

我猜测问题出在queueBooks:方法中,当模型被添加到。时 集合它会触发一个add事件,然后用于通过renderBook回调渲染书籍......所以我认为如果模型已经存在于集合中,它就不会再触发添加事件而不会渲染书籍....怎么解决这个?????? !!!!!!!!!!!!!!!

编辑:正如Derick所建议的那样 -

this.authors = this.options.authors;
this.authors.bind('select', this.renderBooks);

这完美无缺 但是这样在集合中没有生成添加事件,因为没有添加任何模型.....我之所以想要书籍模型的原因BookList集合是在booklist集合上有一个过滤器,以便根据价格和其他标准过滤它们,有没有办法实现这些功能?????????

1 个答案:

答案 0 :(得分:1)

  

我猜测问题出在queueBooks:方法中,当时a   model被添加到集合中,它会触发一个add事件   用于通过renderBook回调渲染书籍...所以我想如果   该模型已经存在于集合中,它不会触发添加   事件再次因此没有呈现书籍

这是正确的。您只能将模型添加到集合一次。当您尝试第二次添加时会抛出JavaScript错误。

你已经拥有了所需的一切,你只是在听错事件并以错误的顺序做事。您需要收听模型的select事件,并使用它来显示模型,而不是将模型添加到集合中以显示模型。

this.authors = this.options.authors;
this.authors.bind('select', this.renderBook);