Marionette.js - 未捕获的ReferenceError:未定义文本

时间:2016-09-22 16:09:05

标签: javascript backbone.js marionette

我想知道是否有人可以帮助找出这种情况下的错误。我得到了#34; Uncaught ReferenceError:文本未定义"在第6行app.js:

((__t=( text ))==null?'':_.escape(__t))+

driver.js:

var Marionette = require('backbone.marionette');
var TodoView = require('./views/layout');

var initialData = {
  items: [
    {assignee: 'Scott', text: 'Write a book about Marionette'},
    {assignee: 'Andrew', text: 'Do some coding'}
  ]
};


var App = new Marionette.Application({
  onStart: function(options) {
    var todo = new TodoView({
      collection: new Backbone.Collection(options.initialData.items),
      model: new ToDoModel()
    });
    todo.render();
    todo.triggerMethod('show');
  }
});

App.start({initialData: initialData});

视图/ layout.js

var Backbone = require('backbone');
var Marionette = require('backbone.marionette');
var ToDoModel = require('../models/todo');

var FormView = require('./form');
var ListView = require('./list');


var Layout = Marionette.View.extend({
  el: '#app-hook',

  template: require('../templates/layout.html'),

  regions: {
    form: '.form',
    list: '.list'
  },

  collectionEvents: {
    add: 'itemAdded'
  },

  onShow: function() {
    var formView = new FormView({model: this.model});
    var listView = new ListView({collection: this.collection});

    this.showChildView('form', formView);
    this.showChildView('list', listView);
  },

  onChildviewAddTodoItem: function(child) {
    this.model.set({
      assignee: child.ui.assignee.val(),
      text: child.ui.text.val()
    }, {validate: true});

    var items = this.model.pick('assignee', 'text');
    this.collection.add(items);
  },

  itemAdded: function() {
    this.model.set({
      assignee: '',
      text: ''
    });
  }
});

module.exports = Layout;

todoitem.html

<%- item.text %> &mdash; <%- item.assignee %>

我可以解释为什么没有定义文本吗?

3 个答案:

答案 0 :(得分:1)

检查你的ToDoModel输入错误,Backbone Model字段应为&#34;默认&#34;不是&#34;默认&#34;,在解析模板时,Marionette视图会查找&#34;默认值&#34;字段:

https://marionettejs.com/docs/master/template.html#rendering-a-model

所以ToDoModel代码应该是这样的:

&#13;
&#13;
...

var ToDo = Backbone.Model.extend({
    defaults: {
        assignee: '',
        text: ''
    },
    
...
&#13;
&#13;
&#13;

答案 1 :(得分:0)

你应该看一下Marionnette的ItemView documentation,它解释了如何使用自定义数据渲染模板。

var my_template_html = '<div><%= args.name %></div>'
var MyView = Marionette.ItemView.extend({
  template : function(serialized_model) {
    var name = serialized_model.name;
    return _.template(my_template_html)({
        name : name,
        some_custom_attribute : some_custom_key
    });
  }
});

new MyView().render();
     

请注意,使用模板函数允许传递自定义参数   进入.template函数并允许更多地控制如何   调用.template函数。

根据您目前提供的代码,我无法提供帮助。

答案 2 :(得分:0)

Marionette在将上下文传递给“模板”之前调用'serializeModel'。所以,如果你有像

那样的backbone.model
{
    .
    .
    .
    attributes: {
        text: 'someText',
        asignee: 'someAsignee'
    }
    .
    .
}

您的模板将会收到

{
    text: 'someText',
    assignee: 'someAsignee'
}

我使用过把手但没有完全用下划线。 {{this.text}}{{this.assignee}}的工作方式类似于模板中的魅力。因此,请尝试this.texttext代替item.text,看看是否有效