【问题标题】:Backbone + jQuery .append()骨干网 + jQuery .append()
【发布时间】:2013-02-10 01:50:03
【问题描述】:

我已经梳理了大多数相关的帖子,但找不到类似的案例。我有点难过,希望你们能解决问题。

我正在使用带有 REST+JSON API 的 Backbone + jQuery + Handlebars + Bootstrap。

我正在尝试构建可能包含文本的多个项目的可折叠视图。折叠分为三个级别:1)仅项目,2)项目+文本标题,3)项目+文本标题+全文。

应该发生的是,ItemListView 从 API 中提取所有项目并为每个项目呈现一个 ItemView。 ItemView 进一步细分为两个 Handlebars 模板 - 第一个用于特定于项目的标记,另一个用于特定于文本的标记。

问题似乎是this.model.get("texts").forEach(function(txt, that) 中的$("#item" + itemNum) 选择器不匹配任何内容(或者至少.append() 不添加任何内容)。

我尝试将选择器更改为$("item1"),但随后代码变得非常糟糕,生成了一个 Handlebars 模板,其中包含第一个 Item 的第一个 Text 的标题和 other Item 的内容正文正文:

<div id="item1" class="item in collapse" style="height: auto;">
<ul class="text-list"></ul>

<li class="text-container"><span class="pict text-title collapsed" data-toggle="collapse" data-target="#text2-1">Otsikko 1</span>
  <span id="text2-1" class="collapse item-text in" style="height: 0px;"><br>Teksti 3</span></li>
</div>

还要注意奇怪的style="height: 0px;"item in collapse,它们似乎不是来自任何地方(至少不是我的模板...)。

API目前返回如下测试数据(两个Item,第一个有两个Text,第二个有一个):

[{"texts": [{"text": "Teksti 1", "id": 1, },
            {"text": "Teksti 2", "id": 2, }],
  "open": false,
  "id": 1,
  "name": "Asia 1"},
 {"texts": [{"text": "Teksti 3", "id": 1, }],
  "open": false,
  "id": 2,
  "name": "Asia 2"}]

我对整个事情有一个看法:

var ItemView = Backbone.View.extend({
  tagName: 'div',

  initialize: function () {
    _.bindAll(this, 'render');
    this.model.bind('change', this.render);
  },

  render: function (itemNum) {

  // Render item titles

  try {
    var src = $("#item-template").html();
    var itemTemplate = Handlebars.compile(src);
  } catch (e) {
    console.log(e)
  }

  $(this.el).html(itemTemplate({
    itemNum: itemNum,
    itemName: this.model.get("name"),
  }));

  // Add texts under titles

  try {
    var src = $("#text-template").html();
    var textTemplate = Handlebars.compile(src);
  } catch (e) {
    console.log(e)
  }

  // MOST LIKELY THE PROBLEM:
  var counter = 0;
  this.model.get("texts").forEach(function(txt) {
    console.log(txt.text);
    counter++;        
    $("#item1").append(textTemplate({
      itemNum: itemNum,
      textNum: counter,
      text: txt.text
    }));
  });

以防万一,这里是列表视图:

  var ItemListView = Backbone.View.extend({
    el: $('#items'),

    initialize: function () {
      _.bindAll(this, 'render', 'appendItem');
      this.items = new Items();      

      this.render();
    },

    render: function () {
      var self = this, p;
      p = this.items.fetch();

      p.done(function () {
        var itemCount = 0;
        _(self.items.models).each(function(item) {
          itemCount++;
          self.appendItem(item, itemCount);
        }, self);
      });
    },

    appendItem: function (item, itemCount) {
      var itemView = new ItemView({
        model: item
      });
      $('#item-list', this.el).append(itemView.render(itemCount).el);
    }
  });

...和 ​​Handlebars 模板:

<script id="item-template" type="text/x-handlebars-template">
  <span class="item-title pict" data-toggle="collapse" data-target="#item{{itemNum}}">{{itemName}}</span>
  <div id="item{{itemNum}}" class = "collapse item">
    <ul class="text-list"></ul>
  </div>
</script>

<script id="text-template" type="text/x-handlebars-template">
  <li class="text-container"><span class="pict text-title" data-toggle="collapse" data-target="#text{{itemNum}}-{{textNum}}">Otsikko {{textNum}}</span>
  <span id="text{{itemNum}}-{{textNum}}" class="collapse item-text"><br>{{text}}</span></li>
</script>

...和正在呈现的 HTML:

<div class="span2" id="items">
  <div id="item-list"></div>
</div>

谢谢!我已经用头撞墙好几个小时了,不知道该怎么办。

另外,我这个周末才编写了我的第一个 Backbone.js 代码,所以我很感激你可能有任何关于风格/设计的 cmet。 :)

【问题讨论】:

  • 当我遇到这样的问题时,我发现检查 jQuery 对象是否包含任何元素很有帮助:console.log($("#item1").length),并确保我尝试附加的字符串包含我认为是的:var parsedTpl = textTemplate({...}); console.log(parsedTpl);
  • 你试过this.$(...)而不是$(...)吗?如果您的 el 不在 DOM 中,但您需要将搜索本地化到您的 el 而不是查看 DOM。那里有很多代码,所以这只是一个疯狂的猜测。
  • @muistooshort,对不起,我忘了在问题中添加一件奇怪的事情:当我在循环中添加 console.log($("#item1", window.parent.document).html()); 时,它返回以下匹配项: null null
      所以,它只在第三次尝试时才找到元素&lt;ul&gt;...?这听起来像是我在意识到我需要添加一个 .success() 处理程序之前对 .fetch() 感到头疼的时候。但是没有任何异步发生,是吗?当我在 Firefox/Chrome JS 控制台中进行匹配时,它很好地找到了$("#item1")

    标签: jquery backbone.js twitter-bootstrap handlebars.js


    【解决方案1】:

    好的,我有时间再看一遍,发现这是一个简单的错误

    $(this.el).html(itemTemplate({
        itemNum: itemNum,
        itemName: this.model.get("name"),
    }));
    

    .html() 更改为 .append() 就成功了,这并不奇怪......

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多