【问题标题】:Backbone.js turning off wrap by div in renderBackbone.js 在渲染中关闭 div 换行
【发布时间】:2011-12-15 04:58:18
【问题描述】:

我有模型帖子和收藏帖子。并且想用<select id="multi" multiple="multiple">中的所有帖子列表制作表格。所以我必须使用这个模板在我的#multi 中进行 PostView 渲染:

<option value=""><%= title %></option>

但最后我把它用 div 包裹起来了。有什么办法可以不用&lt;div&gt;包装这个模板吗?

【问题讨论】:

    标签: backbone.js render


    【解决方案1】:

    如果您没有为视图定义el(或tagName)(在类中或在实例化期间),则视图将被放置在 div 标记内。 http://documentcloud.github.com/backbone/#View-el

    var PostView = Backbone.View.extend({
      tagName: 'option'
    });
    

    更新

    从 v0.9.0 开始,Backbone 有 view.setElement(element) 来完成这项工作。

    var PostView = Backbone.View.extend({
        initialize: function() {
            var template = _.template('<option value=""><%= title %></option>');
            var html = template({title: 'post'});
            this.setElement(html);
        }
    });
    

    【讨论】:

    • 我也尝试过这种方法,但看不到在此
    • 在您的视图中,您可以使用 jquery 设置值$(this.el).attr('value', 'something');
    • 甚至this.el.value = 'something' 将 jQuery 留在需要的地方:)
    • @TomTu 谢谢你,我不知道你可以这样设置 :)
    • 有没有办法在 Marionette 中轻松应用这个?
    【解决方案2】:

    如果你不想让视图包裹你的 HTML,你必须做一些事情:

    1. 完全替换this.el
    2. 在新的el 上致电delegateEvents
    render: function(){
      var html = "some foo";
      this.el = html;
      this.delegateEvents(this.events);
    }
    

    由于 Backbone 生成了 div 或其他标签(基于您对视图的 tagName 设置),您必须完全替换它。这很容易做到。但是,当您这样做时,您会丢失已声明的事件,因为 Backbone 在后台使用 jQuery 的 delegate 将它们连接起来。要重新启用您声明的事件,请致电 delegateEvents 并传入您的事件声明。

    结果是您的view.el 将是您想要的&lt;option&gt; 标签,仅此而已。

    【讨论】:

    • 非常感谢您的帮助,德里克。我将在我未来的项目中使用您的建议/
    • 您不必将 this.events 传递给 delegateEvents,它将默认为。
    • 在最新版本的 BB 中有这个功能 - view.setElement(html)
    • 有没有办法在 Marionette 的地区实现这一点?
    【解决方案3】:

    在 0.9.0 版本中,Backbone 引入了view.setElement(element) 来处理这个操作。

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2011-05-17
      • 1970-01-01
      相关资源
      最近更新 更多