【问题标题】:Backbone view don't get el in template骨干视图在模板中没有得到 el
【发布时间】:2013-05-29 01:30:15
【问题描述】:

我用自己的html调用列表元素的视图,在这个视图中有一个对单个项目的另一个视图的迭代调用。问题是listelement的第一个视图看不到自己的html。如果我将 el 设置为获取 id (el:$("#pagination-centered") ) ,我想在其中追加迭代单个元素,不要渲染。

列表元素视图:

        define(["jquery", "underscore", "Backbone", "Handlebars",  
   "views/singlepostview", "text!templates/home.html"],**<--html**
   function ($, _, Backbone, Handlebars,SinglePost, template) {

  var Home = Backbone.View.extend({
   el:$("#pagination-centered"),//it is inside home.html defined above 

    template: Handlebars.compile(template),

    initialize: function () {
     // this.model.bind("reset", this.render, this);

    },


       events: {

    },      



    render: function (eventName) {
       $(this.el).empty();
      _.each(this.model.models, function (ad) {
        $(this.el).append(new SinglePost({
          model: ad
        }).render().el);
      }, this);


      return this;



         }




         });

     return Home;

      });

单元素视图:

        define(["jquery", "underscore", "Backbone", "Handlebars", "text!templates/singlepost.html"],
function ($, _, Backbone, Handlebars, template) {

var SinglePost = Backbone.View.extend({
     //el:$("#pagination-centered"),
    //tagName: "li",

    events: {
      "click": "goToDetails"
    },

    template: Handlebars.compile(template),

    initialize: function () {
      this.model.bind("change", this.render, this);
      this.model.bind("destroy", this.close, this);
    },

    render: function (eventName) {
      var ad = this.model.toJSON();
     // console.log(ad);
      ad.cid = this.model.cid;
      $(this.el).html(this.template(ad));
      return this;
    },

    goToDetails: function () {
      Backbone.history.navigate("#user/"+this.model.id, {trigger: true});
    }
  });

return SinglePost;

与视图主页关联的模板(元素列表):

         <div class="row">

            <div class="page-header ">
              <p class="pull-right"><a href="#">see all</a></p>
              <h4>Honors <small>(10)</small></h4>
            </div>

            <div class="pagination-centered">


            </div>

       </div>

与查看 SinglePost(列表项)关联的模板:

       <a href="#"><img src="{{immagine.url}}" class="img-circle"></a>

我想在 Home 视图的模板内,特别是在 div class="pagination-centered" 内渲染这个(最​​后一个)singlepost 视图的 singlepost 模板。 将按以下方式完成:

              **<div class="row">

            <div class="page-header ">
              <p class="pull-right"><a href="#">see all</a></p>
              <h4>Honors <small>(10)</small></h4>
            </div>

            <div class="pagination-centered">

            *<a href="#"><img src="{{immagine.url}}" class="img-circle"></a>*


            </div>
          </div>**

【问题讨论】:

  • 这里的逻辑问题,你的元素不应该在视图的模板中。你为什么不用你的视图来创建它呢?使用tagNameattributes 属性。
  • 因为我需要在复杂的 html 中插入单个元素的迭代视图的结果,如下所示:
  • 如何创建带有标记名和属性的复杂 html?
  • 嗯,使用tagNameidattributes作为你元素的参数,当你实例化你的视图时,你的元素就会被创建。您只需将其附加到 DOM。顺便说一句,如果您需要输入的 html 不仅仅是 #pagination-centered 元素,则不应将其附加到视图中。
  • 所以我可以简单地使用 tagName 创建一个像上面这样的复杂 html?

标签: javascript jquery backbone.js


【解决方案1】:

$("#pagination-centered") 将在当前窗口 dom 中查找该选择器。这意味着如果您的模板的内容(定义 pagination-centered 元素的位置)不在 dom 中,则将无法找到它(向 null el 屈服,并且没有渲染任何内容)。

我认为有更清晰的方法可以在 Backbone 中实现良好的模板,但在您的情况下,快速简单的方法是将视图创建为

var Home = Backbone.View.extend({
    tagName: "section",
    render: function() {
        this.$el.html( /* load the content of your home template here */);
        var list = this.$('#pagination-centered')
        for ( ... ) // here you loop over your models
            list.append(singlePost.render().el);
        return this;
}

var SinglePost = Backbone.View.extend({
    tagName: "li",
    render: function() {
        this.$el.html( /* load the content of your single post template here */);
        return this;
    }
}

Backbone Views 中的一个常见缺陷是每个视图都有一个 implicit 元素,该元素包装了所有被渲染的内容。在这种情况下,例如,您的 Home 模板将在 section 中呈现。您尝试做的事情(将 el 属性分配给某个 dom 选择器)虽然在技术上是可行的,但并不是实现该目标的常见或建议方法。

另一个建议是尝试使用有意义且语义正确的标记。如果pagination-centered 是一个列表,它应该是ulol,而不是div

【讨论】:

  • 我需要从 PostList 模板中捕获 $("#pagination-centered"),因为在这个模板中有几个我需要的嵌套 html 并且不能通过 onli 标签名称来实现。我可以在 postlist 视图中创建第二个函数 render 来渲染并附加到 dom 本身的模板,然后在第一个函数 render 中捕获它以附加迭代视图吗?
  • 我想如果你编辑你的问题并添加你正在谈论的模板会更好(这样我们可以看到实际的标记并更好地理解你想要实现的目标)。我想我有你的问题,但不是 100% 确定我想看到标记。
  • 好的,是的,我看到了模板,这就是我的想法,所以我在回答中写的内容仍然适用。我将编辑我的答案并添加有关如何执行此操作的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多