如何呈现内联的Backbone视图?

时间:2014-11-24 19:49:39

标签: javascript backbone.js

我有一些遗留HTML,它通过AJAX返回项目列表。

var xhr = $.get('/example');
xhr.done(function(data){
  $('#container').html(data);
});

我已经重构了一段HTML以使用Backbone View。我想立即渲染视图,内联,而不指定选择器。以下是HTML的简化示例:

<ul>
  <li>
    Some stuff here
    <script>
      var view = new MyView();
      // render the view and put the html right here!
    </script>
  </li>
</ul>

我尝试了类似document.write(view.render().el)的内容,但效果不正确。

如何在线渲染骨干视图?

更新:此问题的原因是会有多个列表项,此视图将多次呈现。我并不认为有必要为每个列表项创建一个唯一的ID,只是为了将Backbone视图附加到每个列表项。我想也许有一种简单的方式可以说&#34;这个父母&#34;在脚本标记内。也许那是我真正的问题...

2 个答案:

答案 0 :(得分:1)

render函数应将视图呈现为$el属性。

渲染后,您可以访问$el以获取渲染视图。你可以像这样写“内联”:

<ul>
  <li>
    Some stuff here
    <script>
      var view = MyView();
      view.render();
      document.write(view.$el.html());
    </script>
  </li>
</ul>

一个完整的例子:

<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"></script>

<script type="text/template" id="search_template">
  <label>Search</label>
  <input type="text" id="search_input" />
  <input type="button" id="search_button" value="Search" />
</script>

<script type="text/javascript">
    SearchView = Backbone.View.extend({
        render: function() {
            var template = _.template($("#search_template").html(), {});
            this.$el.html(template);
        }
    });

    var search_view = new SearchView();
    search_view.render();
    document.write(search_view.$el.html());
</script>

请注意,这不是Backbone的使用方式。这种内联不适用于事件。

正确的方法是将适当的元素传递给视图的构造函数。或者,您可以将元素作为另一个元素的子元素附加以保持完整功能:

document.getElementById('foo').appendChild(myView.$el);

答案 1 :(得分:1)

尝试这样的事情。

<ul>
  <li>
    Some stuff here
    <script id="use_an_id_for_safety">
      // I assume you instantiate correctly, but I explicitly use new here
      var view = new MyView({el: $(document.currentScript)});// or use the id
      view.render();
      // render the view and put the html right here!
    </script>
  </li>
</ul>

Here是解决方案的小提琴