我可能对如何实现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 });
答案 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)
从我的实践来看,使用多个模型处理视图的最佳方法是使用两种视图:
<ul>
<li>
您的父视图呈现所有子视图并观察集合更改。
每个子视图都将其范围限制为li
元素,因此模型上的每个事件(其视图)都是单独处理的。
维护更简洁,更清晰,更好地概述模型 - 视图关系。
答案 2 :(得分:1)
将“#redirect_product”替换为“.redirect_product”类,然后您可以在页面上添加许多内容。
大部分时间在骨干视图中我只使用类。很少是id。鉴于骨干有一个发现者
this.$(".redirect_product")
只有在视图范围内搜索时,如果类是,则不需要太在意 也存在于视图范围之外的另一个元素上。