代码之家  ›  专栏  ›  技术社区  ›  Gwater17

无法有条件地渲染视图木偶

  •  1
  • Gwater17  · 技术社区  · 7 年前

    我不知道如何使用函数来决定在木偶中渲染哪个子视图。根据这里的文档,它似乎应该非常简单: https://marionettejs.com/docs/master/marionette.collectionview.html#collectionviews-childview

    我发现复合视图文档中的页面推断使用函数定义子视图应该与集合视图和复合视图相同 https://marionettejs.com/docs/master/marionette.compositeview.html#compositeviews-childview )

    然而,通过以下代码,我得到了错误消息“Uncaught TypeError:view.on不是函数”我的代码如下:

    var Backbone = require('backbone');
    var Marionette = require('backbone.marionette');
    
    var ToDoModel = require('./models/todo');
    
    var ToDo = Marionette.LayoutView.extend({
      tagName: 'li',
      template: require('./templates/todoitem.hbs')
    });
    
    
    var TodoList = Marionette.CompositeView.extend({
      el: '#app-hook',
      template: require('./templates/todolist.html'),
    
      childView: function(item) {
        return ToDo;
      },
      childViewContainer: 'ul',
    
      ui: {
        assignee: '#id_assignee',
        form: 'form',
        text: '#id_text'
      },
    
      triggers: {
        'submit @ui.form': 'add:todo:item'
      },
    
      collectionEvents: {
        add: 'itemAdded'
      },
    
      modelEvents: {
        invalid: 'itemInvalid'
      },
    
      onAddTodoItem: function() {
        this.model.set({
          assignee: this.ui.assignee.val(),
          text: this.ui.text.val()
        });
    
        if (this.model.isValid()) {
          var items = this.model.pick('assignee', 'text');
          this.collection.add(items);
        }
      },
    
      itemAdded: function() {
        this.model.set({
          assignee: '',
          text: ''
        });
    
        this.ui.assignee.val('');
        this.ui.text.val('');
      },
    
      itemInvalid: function() {
        console.log('this item is invalid!')
      }
    
    });
    
    
    var todo = new TodoList({
      collection: new Backbone.Collection([
        {assignee: 'Scott', text: 'Write a book about Marionette'},
        {assignee: 'Andrew', text: 'Do some coding'}
      ]),
      model: new ToDoModel()
    });
    
    todo.render();
    

    为什么不呈现ToDo视图?

    1 回复  |  直到 7 年前
        1
  •  3
  •   lucasjackson    7 年前

    看起来您使用的是旧版本的木偶( LayoutView 例如,在版本3)中删除了,并引用了最新版本(当前为3.5.1)的文档。

    在旧版本的木偶中, childView 由于不支持函数,您应该使用 getChildView

    因此,代码的相关部分应该如下所示:

    var TodoList = Marionette.CompositeView.extend({
      ...
      getChildView: function(item) {
        return ToDo;
      },
      ...
    });