Backbone de collecte des extractions de données, mais ne définit pas les modèles
Je suis en train de remplir mon épine Dorsale de la collection à partir d'une API, et de modifier la vue pour afficher les données. Le fetch() appel dans ma collection semble réussir, et saisit les données, mais l'opération d'extraction ne met pas à jour les modèles de la collection.
C'est ce que j'ai eu pour mon modèle et collection:
var Book = Backbone.Model.extend();
var BookList = Backbone.Collection.extend({
model: Book,
url: 'http://local5/api/books',
initialize: function(){
this.fetch({
success: this.fetchSuccess,
error: this.fetchError
});
},
fetchSuccess: function (collection, response) {
console.log('Collection fetch success', response);
console.log('Collection models: ', this.models);
},
fetchError: function (collection, response) {
throw new Error("Books fetch error");
}
});
et j'ai fait de mon point de vue comme ceci:
var BookView = Backbone.View.extend({
tagname: 'li',
initialize: function(){
_.bindAll(this, 'render');
this.model.bind('change', this.render);
},
render: function(){
this.$el.html(this.model.get('author') + ': ' + this.model.get('title'));
return this;
}
});
var BookListView = Backbone.View.extend({
el: $('body'),
initialize: function(){
_.bindAll(this, 'render');
this.collection = new BookList();
this.collection.bind('reset', this.render)
this.collection.fetch();
this.render();
},
render: function(){
console.log('BookListView.render()');
var self = this;
this.$el.append('<ul></ul>');
_(this.collection.models).each(function(item){
console.log('model: ', item)
self.appendItem(item);
}, this);
}
});
var listView = new BookListView();
et mon API renvoie les données JSON comme ceci:
[
{
"id": "1",
"title": "Ice Station Zebra",
"author": "Alistair MacLaine"
},
{
"id": "2",
"title": "The Spy Who Came In From The Cold",
"author": "John le Carré"
}
]
Lorsque j'exécute ce code j'obtiens ceci dans la console:
BookListView.render() app.js:67
Collection fetch success Array[5]
Collection models: undefined
qui m'indique que le téléchargement d'appel est l'obtention de données OK, mais que ce n'est pas de peupler les modèles avec elle. Quelqu'un peut me dire ce que je fais mal?
OriginalL'auteur And Finally | 2013-10-20
Vous devez vous connecter pour publier un commentaire.
Votre
fetchSuccess
fonction doit avoircollection.models
pasthis.models
.et s'il vous plaît examiner les suggestions données par @Pappa.
fetchSuccess
est une fonction de callback appelée parBackbone.sync
qui est exécuté dans la portée globale par Backbone.js.Ohhhh c'est pourquoi! Grâce user10.
OriginalL'auteur user10
Vous appelez à récupérer sur votre liste compilée collection deux fois, une fois quand il est initialisé et de nouveau lors de votre BookListView est initialisé. Il est considéré comme une mauvaise pratique d'avoir une collection de remplir lui-même au moment où il est instancié. Vous êtes également le rendu de votre vue deux fois à l'intérieur de son initialisation d'appel, une fois en réponse à la "reset" de l'événement, puis vous êtes également en l'appelant directement.
Je voudrais proposer la suppression de la fonction d'initialisation complètement à partir de votre liste compilée de collecte et de retrait de l'appel à cette fonction.render(); à la fin de votre BookListView initialize appel.
si une vue est une méthode initialize il appelle automatiquement.render()?
Non, vous devez appeler la fonction rendu manuellement.
OriginalL'auteur Pappa