我的视图中的Backbone.js事件被多次触发

时间:2011-06-19 14:19:39

标签: javascript backbone.js

我可能对如何实现backbone.js有误解,因为我支持多个模型的所有视图(例如,可以显示多个产品的“产品”视图)都会将事件发送到每个视图在那次会议中创建。

因此,在下面的示例中,当我单击#redirect_product链接时,根据我看到的产品数量多次调用“redirect_product”。如果我查看了5个产品,那么在第6次点击时我将收到6个警报。

这里发生了什么?

  505     /****************PRODUCT VIEW****************/
  506     App.Views.Product = Backbone.View.extend({
  507         el: $('#content_sec'),
  508 
  509         events: {
  510             "click #redirect_product": "redirect_product",
  511         },
  512 
  513         initialize: function(options) {
  514             this.model = this.options.model;
  515             this.render();
  516 
  517         },
  518 
  519         render: function() {
  520             $(this.el).empty();
  521             $('#product_detail_template').tmpl(this.model.toJSON()).appendTo($(this.el));
  522 
  523 
  524             //Activate facebook buttons
  525             if (typeof FB  != "undefined"){
  526                         FB.XFBML.parse(document.getElementById('item_share'))
  527             }
  528 
  529             wishlist.init();
  530             return this;
  531         },
  532 
  533         redirect_product: function() {
  534             //Send data on what product being clicked by whom
  535             alert('hi');
  536 
  537 
  538             //Open new window with product for user
  539             var external_link = this.model.get('product').attributes['External Link'];
  540             window.open(external_link, "external_site");
  541 
  542         },
  543     });

3 个答案:

答案 0 :(得分:8)

我认为,问题在于您对所有观看次数使用相同的el

创建新产品时,请执行以下操作:

$('#content_sec').append('<div class="productView"></div>');
var product = new Product();
var view = new ProductView({model: product, el: $('.productView:last')});

一旦每个产品都有自己的范围,那么事件将按预期工作。

答案 1 :(得分:3)

从我的实践来看,使用多个模型处理视图的最佳方法是使用两种视图:

  • 父视图(将Collection作为模型) - 将其视为<ul>
  • 子视图(使用集合中的模型) - 将其视为<li>

您的父视图呈现所有子视图并观察集合更改。

每个子视图都将其范围限制为li元素,因此模型上的每个事件(其视图)都是单独处理的。

维护更简洁,更清晰,更好地概述模型 - 视图关系。

答案 2 :(得分:1)

将“#redirect_product”替换为“.redirect_product”类,然后您可以在页面上添加许多内容。

大部分时间在骨干视图中我只使用类。很少是id。鉴于骨干有一个发现者

this.$(".redirect_product")

只有在视图范围内搜索时,如果类是,则不需要太在意 也存在于视图范围之外的另一个元素上。