javascript - 为什么我的 Marionette itemView 不渲染?

标签 javascript backbone.js marionette backbone.js-collections

我正在使用带有 Handlebars 模板的 Marionette,但无法让我的 itemView 在 CollectionView 内呈现。

这是 CollectionView 代码:

define( [ 'App', 'marionette', 'handlebars', 'models/Model', 'collections/Collection', 'text!templates/welcome.html'],
function(App, Marionette, Handlebars, Model, Collection, template) {
    //ItemView provides some default rendering logic
    var ItemView = Marionette.ItemView.extend( {
        //Template HTML string
        template: Handlebars.compile(template),
        //model: new Model(),

        // View Event Handlers
        events: {

        },
        initialize: function(o) {
            console.log('init itemView');
        }
    });
    return Marionette.CollectionView.extend( {
        issues: new Collection(),
        itemView: ItemView,
        onRender: function() {this.issues.fetch()},
        initialize: function(o) { console.log('init collectionView')}
    });
});

这是模板

<div class="hero-unit">
<h1>Marionette-Require-Boilerplate Lite</h1>
<p>Lightweight Marionette Boilerplate application to get you off the ground fast.</p>
<p class="muted">
    You are viewing this application on
   </p>
<br/>
<table>
    {{#each items}}
    <tr><td>{{title}} - {{number}}</td></tr>
    {{/each}}
</table>
<a class="btn btn-primary btn-large" href="https:github.com/BoilerplateMVC/">See more Boilerplates</a>

我从这段代码中得到的唯一信息是 CollectionView 确实触发了它的初始化方法,并且该集合是从 GitHub 获取的。

最佳答案

无法正常工作的原因有多种,具体取决于您使用的 Marionette 版本:

  1. 对于最新的 Marionette 版本,您必须使用“childView”而不是“itemView”。
  2. 要显示的项目应位于属性“集合”中,而不是“问题”中。

    示例:

      var IssuesView = Marionette.CollectionView.extend({
        childView: IssueView,
        onRender: function () {
          this.collection.fetch();
        },
        initialize: function (o) {
          console.log('init collectionView');
        }
      });
      new IssuesView({'collection': new Backbone.Collection()});
    

现在,根据您提供的代码,我假设您的目标是显示“items”内的问题,如果这是正确的,我建议使用“CompositeView”,然后您可以提供一个“container” ' 并呈现项目内的“问题”。例如:

        var IssueView = Marionette.ItemView.extend({
            itemTag: 'tr',
            //Template HTML string
            template: Handlebars.compile($("#item-template").html()),
            //model: new Model(),

            // View Event Handlers
            events: {

            },
            initialize: function (o) {
                console.log('init itemView');
            }
        });
        var IssuesView = Marionette.CompositeView.extend({
            childView: IssueView,
            childViewContainer: "#issues",
            template: Handlebars.compile($("#some-template").html()),
            onRender: function () {
                //this.issues.fetch();
            },
            initialize: function (o) {
                console.log('init collectionView');
            }
        });

您的模板在哪里:

<script id="item-template" type="text/x-handlebars-template">
   <td> 
    {{title}} - {{number}}
   </td>
</script>
<script id="some-template" type="text/x-handlebars-template">
  <div class = "hero-unit" >
    <h1>Marionette - Require - Boilerplate Lite </h1>
    <p>Lightweight Marionette Boilerplate ...</p>
    <p class = "muted"> You are viewing this application on </p>
    <br/>
    <table id="issues">

    </table>
 </script>

这是 jsfiddle 的工作版本: http://jsfiddle.net/gvazq82/v5yj6hp4/2/

关于javascript - 为什么我的 Marionette itemView 不渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952317/

相关文章:

backbone.js - 如何配置 karma 以正确使用 'define'(with backbone.js)?

javascript - 当状态数据发生变化时,如何更改平面列表中文本的颜色

javascript - 从 Javascript 调用命令链接操作

javascript - 奇怪的日期解析问题

backbone.js - Backbone Marionette : templateHelpers and itemViewOptions

javascript - Marionette.js - ItemView 获取父区域引用

backbone.js - 使用 Restful 服务的集合排序不适用于 Backbone.Marionette

javascript - $tds.attr ('disabled' ,'disabled' );没有达到我想要的效果

javascript - 使用 Backbone 在预输入建议中包含按钮

javascript - 绑定(bind)以添加到backbone.js集合