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:
- Ajuste su orden de
<script>para que su#tmpl_sourcelistantes de intentar cargar su vista. Cree la función de plantilla compilada en la
initializesu 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.else crea a partir de las propiedadestagName,className,idyattributesde la vista, si se especifica. Si no, el es undivvacío.
Entonces teniendo esto en tu vista:
tagName: ''li''
significa que Backbone creará automáticamente un nuevo elemento <li> como el de su vista.