【问题标题】:event not firing in backbone.js view事件未在backbone.js 视图中触发
【发布时间】:2013-02-15 02:53:03
【问题描述】:

这是我对“tr”单行的看法。我想单击名称单元格并弹出该单元格的视图。我无法触发事件..

我错过了什么吗?谢谢!

所以这个问题由 gumballhead 解决,我遇到的问题是需要有一个与 ItemRowView 关联的 tagName。然后在渲染函数中,我需要做 self.$el.html(this.template(model));

觉得分享给大家会有所帮助..

    ItemRowView = Backbone.View.extend({

    initialize : function() {
    },
    template : _.template($('#item-row-template').html()),
    render : function() {       
        var self=this;        
        var model = this.model.toJSON();
        self.$el = this.template(model);
        return self.$el;
    },

    events : {
        "click td .item-name" : "viewOneItem"
             //Even if I change it to "click td":"viewOneItem", still not firing
    },
    viewOneItem : function() {
        console.log("click");
    }
});

收藏视图:

ItemsView = Backbone.View.extend({

    initialize : function() {
    },
    tagName : "tbody",

    render : function() {
        var self = this;
        this.collection.each(function(i) {
            var itemRowView = new ItemRowView({
                model : i
            });
            self.$el.append(itemRowView.render()); 
        });
        return self.$el;
    }

});

应用视图: AppView = Backbone.View.extend({ this.items = new Items();

  this.items.fetch();
  this.itemsView = new ItemsView({collection:this.items});    

  $('#items-tbody').html(itemsView.render());

});

对于模板:

<script type="text/template" id="item-row-template">
<tr>
    <td class="item-name">{{name}}</td>
    <td>{{description}}</td>
</tr>
</script>

 <table>
    <thead>
        <tr>
        <th>name</th>
        </tr>
    </thead>
    <tbody id="items-tbody">

    </tbody>
 </table>

【问题讨论】:

  • try "click 'td .item-name'" Backbone 通过按空格分隔来绑定事件我相信......它可能与您的选择器有问题。啊,委托事件(这些是)使用不同的拆分器。 ` var delegateEventSplitter = /^(\S+)\s*(.*)$/;`
  • @Cory:这行不通,events 解析器不会知道单引号的含义。
  • 有种不喜欢的感觉

标签: javascript backbone.js


【解决方案1】:

使用"click td.item-name" 作为您的选择器。您当前正在侦听具有“item-name”类的 td 后代的点击。

仅供参考,您的模板中还有一个锚元素的结束标签,而模板中没有开始标签。

编辑:我想你想要self.$el.html(this.template(model)); 而不是self.$el = this.template(model);

但是没有必要使用您发布的代码将this 别名为self

编辑 2:很高兴你把它整理好了。让我给你一个解释。

所有主干视图都需要一个根元素。这是事件哈希中的事件在实例化时委托给的元素。当在没有现有元素的情况下实例化主干视图时,它将根据配置设置创建一个,例如tagName,其默认值为"div"。在您显式注入之前,该元素不会出现在 DOM 中。

因此,当您在 render 方法中设置 self.$el 时,您将覆盖根元素(以及事件,尽管它们永远不会触发,因为它会侦听对 td 的后代的点击DOM 中不存在的 div)。

作为旁注,在您的情况下这不是正确的方法,您可以使用this.setElement($(this.template(model)); 将事件从实例化时创建的 div 重新委托给原始模板创建的 tr。

【讨论】:

  • 谢谢,我已经修好了锚。我在模板中指定了“{{name}}”,该类为“item-name”....即使我删除了类名并执行“点击td”,还是不行..
  • 谢谢,当我在这里使用 self.$el.html() 时,我收到“Uncaught TypeError: Object # has no method 'createDocumentFragment'”...
  • 你在用元素初始化你的视图吗?
  • 在集合中,循环模型时,我做了: var itemRowView = new ItemsRowView({model : i});然后我将 itemRowView 附加到集合视图的渲染中......你的意思是在 ItemsRowView 的初始化函数中做一些事情?谢谢!
  • 但是您的 ItemsRowViews 是管理页面上已经存在的元素还是打算动态添加它们?您的模型是收藏的一部分吗?您可能还想发布表格视图的代码。
猜你喜欢
  • 1970-01-01
  • 2012-03-19
  • 2012-04-16
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多