Underscore.js Modèle Question - Ne peut pas appeler la méthode 'remplacer', null
J'ai été à la recherche sur et trouvé beaucoup de réponses, mais aucune ne semble fonctionner.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Shopping Cart
</title>
<link rel="stylesheet" href="lib/style.css" type="text/css">
</head>
<body>
<script id="rtemp" type="text/x-underscore-template"">
<span><%= title %></span>
</script>
<script src="lib/jquery.js" type="text/javascript"></script>
<script src="lib/underscore.js" type="text/javascript"></script>
<script src="lib/backbone.js" type="text/javascript"></script>
<script src="lib/script.js" type="text/javascript"></script>
</body>
<script>
var Photo = Backbone.Model.extend({
initialize: function(){
console.log('this model has been initialized');
this.bind("change:title", function(){
var title = this.get("title");
console.log("My title has been changed to.. " + title);
var pv = new PhotoView();
pv.render();
});
},
setTitle: function(newTitle){
this.set({ title: newTitle });
},
setLocation: function(newLoc)
{
this.set({location:newLoc});
}
});
var PhotoView = Backbone.View.extend
({
el: $('body'),
render: function(event)
{
var name = myPhoto.get('title');
console.info(name);
var template = _.template($('#rtemp').html(), {title:name});
console.info(this.model);
$(this.el).html(template);
return this;
}
});
</script>
</html>
Premier;
Créer une nouvelle instance de la méthode
var newPhoto = new Photo();
newPhoto.setTitle('Fishing');
Ce beau travail, il va charger dans le corps, par le modèle. Toutefois, si je puis le faire à nouveau,
newPhoto.setTitle('Sailing');
J'obtiens l'erreur "Impossible d'appeler la méthode 'remplacer', null"
Pas de ligne d'erreur, mais je crois que c'est à
var template = _.template($('#rtemp').html(), {title:name});
OriginalL'auteur mcclennon19 | 2012-06-12
Vous devez vous connecter pour publier un commentaire.
Vous avez quelques choses de mal ici.
Votre modèle a un double
"
dans letype
attribut, il convient de:Votre point de vue est
render
est de référencementmyPhoto
quand il doit êtrethis.model
:Et votre principal problème est que votre point de vue utilise
<body>
comme sonthis.el
et votre modèle est à l'intérieur de<body>
.Vous remplacer complètement le contenu de
<body>
lorsque vous effectuez le rendu de votre point de vue:ainsi, après la première
render
appel, il n'y a plus#rtemp
. Puis, sur la prochainerender
appel, vous essayez ceci:mais depuis
#rtemp
n'est pas dans les DOM plus, tout tombe à l'eau.Si vous prenez le modèle immédiatement:
et ensuite utiliser
this.template()
dansrender
:vous aurez plus de chance. Vous aurez, bien sûr, assurez-vous de définir votre point de vue à l'intérieur d'un document-prêt gestionnaire avec cette approche ou
#rtemp
peuvent ne pas être disponibles lorsque vous définissez votre point de vue.Démo: http://jsfiddle.net/ambiguous/dwGsM/
Cela dit, la structure de votre application est plutôt bizarre. Vous avez un modèle qui est à l'écoute de lui-même et ensuite, le modèle crée et rend une vue lorsque quelque chose change. Un modèle à l'écoute de lui-même est bien en soi, mais en général, vous avez vues à l'écoute de modèles et de la vue serait ré-rendu de lui-même (ou d'une partie d'elle-même) que le modèle change.
Votre modèle doit ressembler à ceci:
Et puis votre point de vue comme ceci:
La
_.bindAll
dansinitialiser
assure quethis.render
sera appelée avec le droitthis
; puisinitialize
se lie à l'événement afin qu'il puisse répondre à des changements dans le modèle. Le point de vue sait ce qu'il se soucie de sorte qu'il est responsable de la gestion des modifications dans le modèle. Et dans lerender
, il vous suffit d'appelertoJSON
pour obtenir les données pour le modèle. Aussi, les nouvelles versions de la Dorsale inclure une version mise en cache de$(this.el)
dans la vue comme.$el
de sorte que vous n'avez pas à$(this.el)
plus soi-même.Alors vous feriez manivelle les choses comme ceci:
- Vous dire à la vue de ce modèle à utiliser en spécifiant le
model
option lors de la création de la vue.Vous pouvez également déplacer le modèle
<script>
de<body>
.Nouvelle et Améliorée de Démonstration: http://jsfiddle.net/ambiguous/Kytw7/
Excellentes explications! 1. Je me demandais où appelez-vous
render()
si aprèsvar viewPhoto = new PhotoView({ model: newPhoto });
vous n'avez pas de modifications du modèle. 2. Comment voulez-vous réduire le nombre de "rendu" le moment?Difficile à dire sans plus de détails, mais vous auriez probablement juste de l'appeler manuellement.
"Vous remplacer complètement le contenu de <body> lorsque vous effectuez le rendu de votre point de vue." Merci!!!!
OriginalL'auteur mu is too short