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_sourcelist
antes de intentar cargar su vista. 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 propiedadestagName
,className
,id
yattributes
de la vista, si se especifica. Si no, el es undiv
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.