【问题标题】:How to load Collection of models in Backbone View?如何在主干视图中加载模型集合?
【发布时间】:2014-06-12 14:45:50
【问题描述】:

我正在尝试学习Backbone.js,为此我现在想将一组模型加载到视图中。通过在窗口中打开一个选项卡,我首先添加以下模板:

<script type="text/template" id="tab-content-template">
    <div class="conversation-window" id="conversation<%= ticketId %>"></div>
</script>

在这个模板中,我现在要加载属于 ticketId 的消息集合。所以我做了一个这样的集合:

var MessageCollection = Backbone.Collection.extend({
    url: 'ticket/:id/messages'
});

还有一个观点:

var MessageView = Backbone.View.extend({
    initialize: function(models, options) {
        this.ticketId = options.ticketId;
    },
    el: function() {
        return '#conversation' + this.ticketId;
    },
    className: 'user-message'
});

所以我希望在#conversation1 中插入消息列表(对于ticketId 1)。然后我尝试运行这个:

var messageView = new MessageView(messageCollection, {ticketId: 1});
messageView.render();
console.log(messageView);

不幸的是,没有任何反应,当我查看控制台时,我看到 ticketId: 1el: undefined。我有点迷失在我做错的事情中(总体上有点迷失在 Backbone)。

有人知道我在这里做错了什么以及如何解决吗?欢迎所有提示!

【问题讨论】:

  • 我不确定你是否在你的集合上运行fetch() 来填充其中的模型,尽管我确实看到你将messageCollection 传递给MessageView(尽管我通常将其设置为collection 而不是models)。此外,我在您的视图中看不到指向您的模板的直接链接。不知道你是想看带数据的模型,还是页面的渲染?
  • 如果您在视图中定义el,您是在告诉 Backbone 管理现有元素 - 在本例中,是 ID 为“conversation1”的元素。该元素位于您在消息顶部发布的模板中。在您实例化您的 messageView 之前,您确定将其渲染到您的页面吗?

标签: javascript backbone.js collections


【解决方案1】:

我想这就是你想要的:

<div id = "conversation1">stuff insert here</div>
<script>
  var MessageCollection = Backbone.Collection.extend({
    //  url: 'ticket/:id/messages'   //<-- put this in router
  });

  // you need to create an instance of you collection somewhere and pass in
  // models as parameter. note that your ticketId is included in the models:
  var messageCollection = new MessageCollection([{ticketId:1,attr:'stuff1'}, {ticketId:2,attr:'stuff1'}])


  var MessageView = Backbone.View.extend({
    initialize: function(models, options) {
        this.ticketId_1 = this.collection.models[0].get('ticketId');
        this.ticketId_2 = this.collection.models[1].get('ticketId');
    },
    // can not reference el and define a <div id="user-message"> simultaneously
    /*
    el: function() {
        return '#conversation' + this.ticketId;
    }, 
    */
    className: 'user-message',
    render: function() {
        $('#conversation'+ this.ticketId_1).html(this.$el.html('stuff from model goes in here'));
    }
});

// var messageView = new MessageView( messageCollection, {ticketId: 1});
// the above wouldn't work. your ticketId should be passed into your view via model
// then you associate you view to your collection like so: 
var messageView = new MessageView({ collection: messageCollection });
messageView.render();
console.log(messageView.$el.html());

</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2015-01-31
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2014-06-22
    相关资源
    最近更新 更多