Débogage Backbone.js: le rendu après la collecte fetch()
Je suis en train de faire à base de render() après le fetch() de la collection (épine Dorsale 0.9.2):
var ProjectListView = Backbone.View.extend({
el: $('#container'),
initialize: function () {
this.collection = new ProjectsCollection();
this.collection.bind("change", _.bind(this.render, this));
this.collection.fetch({ success: function () { console.log("collection fetched"); } });
...
},
render: function () {
console.log("rendered");
...
La création de la nouvelle instance de Vue imprime:
collection fetched
De sorte que le render() n'est jamais appelée après fetch(). Ce que je fais mal? Il n'y a pas d'exceptions présent.
Des conseils comment déboguer ce genre de choses de la colonne vertébrale?
Ps.
Il semble que cette fonction est mal documentée, compte tenu du nombre de questions sur.
OriginalL'auteur Fdr | 2012-11-27
Vous devez vous connecter pour publier un commentaire.
De la beaux-manuel:
Et ce qui ne
reset
faire?reset
fait ceci:Donc
fetch
appelsreset
pour mettre à jour la collection de modèles et dereset
déclenche une"reset"
événement, pas un"change"
événement. Aucun de ces modèles ont changé et une collection"change"
événements à venir à partir de ses modèles.Vous devriez avoir
render
lié à"reset"
:Si vous voulez écouter
"change"
événements sur le contenu des modèles, puis vous pouvez lier une"change"
gestionnaire de la collection depuis:La collection sera également générer
"add"
et"remove"
des événements que la collection elle-même des modifications.Des versions plus récentes de colonne vertébrale n'est plus de réinitialisation de collections pendant
fetch
:Et
set
:Donc, avec des versions plus récentes de l'épine Dorsale, vous aurez envie de liste pour le
"add"
,"remove"
, et"change"
événements (dont une collection basée vue doit être à l'écoute de toute façon); vous pouvez également utiliser{reset: true}
sur la premièrefetch
et écouter"reset"
. Je vous recommande l'approche suivante pour la collecte des vues basées sur les:"add"
et gérer cet événement avec un rappel qui ajoute simplement un élément de la vue, de ne pas tout jeter et de re-rendre."remvoe"
et gérer cet événement avec un rappel qui ne supprime que les nouvellement sorti le modèle."change"
et poignée avec un rappel qui remplace (ou mise à jour) l'élément approprié."reset"
et lier derender
. Puis passer{reset: true}
à la collecte initiale defetch
appel.Qui piège les événements importants et de la collection qui va faire la quantité minimale de travail à traiter chacun. Bien sûr, cette stratégie n'est pas applicable à toutes les situations, mais je pense que c'est un bon point de départ.
J'ai lu la documentation et le code source de référence. Et après+ de 15 ans, tous les cadres de chercher à peu près la même.
Je pense que oui. Ces événements de la colonne vertébrale sont des bits de déclenchement: "reset" se pose pour les collections, mais il n'y a pas de similitude quand faire modèle.fetch() (ce qui provoque un "changement" à émettre). La faiblesse de la conception d'api?
Mais alors, comment voulez-vous faire la différence entre un changement à la collecte et à un changement sur l'un de ces modèles? Donc d'ajouter, de supprimer. Et de réinitialiser les événements. Votre point de vue/modèles devraient être en mesure de gérer vide de modèles de sorte qu'une modification de l'événement devrait être suffisant, vous pouvez patch dans un extraites de l'événement si nécessaire par des raisons impérieuses
fetch
.Mon point est que, lorsque les noms sont identiques, alors on s'attendre à un même type de comportement. Si le comportement diffère donc devrait noms: dans le cas du modèle.fecth() pour mieux nommer serait le modèle.load() ou d'un modèle.mise à jour()
OriginalL'auteur mu is too short
Ce qui a changé dans 1.0
http://backbonejs.org/#changelog
"Si vous souhaitez continuer à utiliser le "reset", pass {reset: true}."
OriginalL'auteur Dane Macaulay
Ok, donc, jusqu'à ce que l'on peut expliquer pourquoi la liaison ne fonctionne pas, j'ai utilisé la solution de contournement suivante:
OriginalL'auteur Fdr