javascript html templates backbone.js underscore.js

javascript - TypeError no detectado: no se puede llamar al método ''replace'' de undebone backbone.js



html templates (1)

Intento desarrollar una aplicación RSS simple usando backbone.js. Estoy usando este tutorial backbone.js. Obtengo el siguiente error, en la línea 2 (plantilla), al definir la plantilla. ¿Alguien puede decirme también por qué se define tagName: "li" en el tutorial?

TypeError no detectado: no se puede llamar al método ''replace'' de undebone backbone.js

Javscript

window.SourceListView = Backbone.View.extend({ tagName:"li", template: _.template($(''#tmpl_sourcelist'').html()), initialize:function () { this.model.bind("change", this.render, this); this.model.bind("destroy", this.close, this); }, render:function (eventName) { $(this.$el).html(this.template(this.model.toJSON())); return this; }, close:function () { $(this.el).unbind(); $(this.el).remove(); } });

HTML

<script type="text/template" id="tmpl_sourcelist"> <div id="source"> <a href=''#Source/<%=id%>''<%=name%></a> </div> </script>

Gracias


Estás obteniendo tu error aquí:

template: _.template($(''#tmpl_sourcelist'').html()),

Parte de la parte _.template de _.template implica llamar a String#replace en el texto de la plantilla no compilada en el camino para producir la función compilada de la plantilla. Ese error en particular generalmente significa que de hecho estás diciendo esto:

_.template(undefined)

Eso puede suceder si no hay #tmpl_sourcelist en el DOM cuando dices $(''#tmpl_sourcelist'').html() .

Hay algunas soluciones simples:

  1. Ajuste su orden de <script> para que su #tmpl_sourcelist antes de intentar cargar su vista.
  2. Cree la función de plantilla compilada en la initialize su vista en lugar de en la definición de "clase" de la vista:

    window.SourceListView = Backbone.View.extend({ tagName:"li", initialize:function () { this.template = _.template($(''#tmpl_sourcelist'').html()); //...

En lo que se refiere a tagName , el fino manual tiene esto que decir:

el view.el

[...] this.el se crea a partir de las propiedades tagName , className , id y attributes de la vista, si se especifica. Si no, el es un div vacío.

Entonces teniendo esto en tu vista:

tagName: ''li''

significa que Backbone creará automáticamente un nuevo elemento <li> como el de su vista.