【问题标题】:backbone view with dynamic id具有动态 ID 的主干视图
【发布时间】:2011-11-21 08:07:23
【问题描述】:

我刚刚意识到我误解了Backbone.Viewel 属性。基本上我的视图需要基于其模型属性的动态id 属性。我以为我可以正常工作,因为我只是在模板中指定了它:

<script type="text/template" id="item_template">
  <li class="item" id="{{identifier}}">
    <span class="name">{{name}}</span>
  </li>
</script>

但是,我意识到 Backbone 实际所做的是将这个编译后的模板放入另一个元素中,默认情况下为 div。我通过阅读文档了解了更多相关信息,但我仍然对如何创建动态 id 感到困惑。

最好,我很想找到一种方法,使上述模板中的内容充当我的el,因为它已经拥有我想要的一切,但我不知道这是否可能。所以我想知道是否有一种方法可以指定动态的id 属性。

我尝试在 initialize 方法中设置它,this.id = this.model.get('attr') 但它似乎没有任何效果,可能是因为此时已经太晚了。

我目前正在做的只是使用 jQuery 在render() 期间添加id

this.el.attr(id: this.model.get('identifier'));

它有效,但当然,我只是想问是否有通过 Backbone 进行此操作的首选方式。

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

    是的,在 Backbone 中有一个标准的方法可以做到这一点。您可以将 id 传递给 View 构造函数。您还可以重构您的模板,以便 Backbone 为您创建父 &lt;li&gt; 元素。试试这个更简单的模板:

    <script type="text/template" id="item_template">
      <span class="name">{{name}}</span>
    </script>
    

    并将这些添加到您的视图中:

    myView = Backbone.View.extend({
      className: "item",
      tagName: "li"
    })
    

    并像这样实例化它:

    var view = new YourView({
      model: mymodel,
      id: mymodel.get('identifier') // or whatever
    })
    

    祝你好运!

    【讨论】:

    • 再次感谢 maxl0rd(在另一个问题上帮助了我:D)。这实际上看起来应该可以工作:D我会尝试并回来标记为正确:)
    • 对于那些不知道的人,如果没有指定,tagName默认为div。我会看到很多模板都有一个容器 [form、div 等......带有一个 id],而且它们确实应该是视图的一部分,而不是模板的一部分。如maxl0rd的回答所示
    【解决方案2】:

    还有一种方法。我发现它比每次创建视图实例时传递 id 更方便。

    模板:

     <script type="text/template" id="item_template">
          <span class="name">{{name}}</span>
     </script>
    

    查看:

    var MyView = Backbone.View.extend({
        tagName: 'li',
        attributes: function(){
           return { 
               id: this.model.get('identifier'),
               class: 'item'//optionally, you could define it statically like before
           }
        }
    })
    

    【讨论】:

    • 投票赞成这个答案,因为它在“构造函数”中定义了通用解决方案
    【解决方案3】:

    创建视图时,传入一个选择器,让视图找到现有的预渲染 DOM 元素:

    var id = "1234";
    var view = YourView({el: '#'+id});
    

    【讨论】:

    • 元素没有预渲染,据我所知它不在DOM中。它只是作为模板,在脚本标签中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多