Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在主干视图中加载模型集合?_Javascript_Backbone.js_Collections - Fatal编程技术网

Javascript 如何在主干视图中加载模型集合?

Javascript 如何在主干视图中加载模型集合?,javascript,backbone.js,collections,Javascript,Backbone.js,Collections,我正在努力学习,为此,我现在想将一组模型加载到视图中。通过在窗口中打开选项卡,我首先添加以下模板: <script type="text/template" id="tab-content-template"> <div class="conversation-window" id="conversation<%= ticketId %>"></div> </script> 还有一个观点: var MessageView =

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

<script type="text/template" id="tab-content-template">
    <div class="conversation-window" id="conversation<%= ticketId %>"></div>
</script>
还有一个观点:

var MessageView = Backbone.View.extend({
    initialize: function(models, options) {
        this.ticketId = options.ticketId;
    },
    el: function() {
        return '#conversation' + this.ticketId;
    },
    className: 'user-message'
});
因此,我希望在对话1中插入ticketId 1的消息列表。然后我试着运行这个:

var messageView = new MessageView(messageCollection, {ticketId: 1});
messageView.render();
console.log(messageView);
不幸的是什么也没有发生,当我查看控制台时,我看到ticketId:1,但el:undefined。我有点迷失在我做错的事情中,有点迷失在我的脊梁上


有人知道我做错了什么,我如何解决它吗?欢迎所有提示

我想这就是你想要的:

<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>

我不确定您是否正在对集合运行fetch以填充其中的模型,尽管我确实看到您将messageCollection传递到MessageView,但我通常将其设置为集合而不是模型。此外,我在视图中看不到指向模板的直接链接。我不确定您是想查看包含数据的模型,还是页面的呈现?如果您在视图中定义el,则告诉主干管理一个现有元素—在本例中,是ID为“conversation1”的元素。该元素位于您在邮件顶部发布的模板中。在实例化messageView之前,是否确实要将其呈现到页面中?
<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>