backbone.js modifie le paramètre url d'un modèle et extrait ne met pas à jour les données récupérées
J'ai le Modèle suivant:
window.MyModel = Backbone.Model.extend({
initialize: function(props){
this.url = props.url;
}
parse: function(){
//@override- parsing data fetched from URL
}
});
//instantiate
var mod = new MyModel({url: 'some/url/here'});
- Je utiliser cette variable globale 'mod' pour aller chercher des données dans ce modèle de backend.
//fetch
mod.fetch({
success: function(){ ...},
error: ...
});
Tous les ci-dessus fonctionne bien....
Mon Problème: je veux réutiliser ce modèle en changeant la réinitialisation de l'url et de l'appel d'extraction, mais il ne met pas à jour l'url d'une certaine manière. J'ai essayé ce qui suit:
mod.fetch({
data: {url:'/some/other/url'},
postData: true,
success: function(){ //process data},
error: ...
});
mod.set({url: '/some/other/url'});
//called fetch() without data: and postData: attributes as mentioned in previous
Comment puis-je configurer l'url de mon modèle, de sorte que je pouvais l'appeler fetch() et il récupère les données de mise à jour de l'url? Ai-je raté quelque chose. Merci pour tous les pointeurs..
Mise à JOUR de 1: Fondamentalement, je ne suis pas en mesure d'obtenir des valeurs mises à jour si je n'ai
model.set({url: 'new value'});
suivie par
model.fetch();
"modèle" est une variable globale. La création d'une nouvelle instance de "modèle" de travaux:
model = new Model({url:'/some/other/url'});
model.fetch();
cependant, fonctionne selon les besoins. Est-ce à dire qu'une instance du modèle est attaché de façon permanente à une url et qu'il ne peut pas être remis à zéro?
RÉPONSE À MA QUESTION dans la mise à JOUR 1 instance du Modèle n'est pas attaché de façon permanente à une url. Il peut être remis à zéro de façon dynamique. Veuillez lire @tkone l'explication approfondie et puis @fguillens solution pour une meilleure compréhension.
source d'informationauteur Vikram
Vous devez vous connecter pour publier un commentaire.
Après avoir entendu l' @tkone 'explication...
Si vous voulez toujours avoir une dynamique
Model.url
vous pouvez toujours retarder la construction de moment de l'exécutionessayez ceci:Bien la réponse est ici que vous voulez faire:
L'URL n'est pas partie à l'instance du modèle lui-même, mais plutôt un attribut de la
MyModel
objet que vous créez une instance du modèle. Par conséquent, vous devriez juste mis ça comme si c'était normal JavaScript propriété de l'objet.set
est utilisé uniquement lorsque les données de la configuration (ou, à l'inverse d'obtenir avecget
) est en fait un attribut de données que vous voulez envoyer/recevoir à partir du serveur.Mais pourquoi vous êtes à la modification de l'URL est la question que nous devrions poser. L'idée derrière l'épine Dorsale du modèle/système de collecte, c'est que vous parlez à un point de terminaison REST et chaque modèle a un effet correspondant.
Comme vous avez un blog et que le blog a une "participation" de l'objet qui est disponible à:
Et vous obtenez une épine Dorsale modèle d'Entrée:
Maintenant, quand vous
save
oufetch
épine Dorsale sait comment cela fonctionne.Donc comme vous êtes à la fabrication d'un nouveau modèle:
Ce serait alors faire épine Dorsale de faire une requête HTTP POST pour
/rest/entry
avec le corps:(Lorsque vous effectuez votre
mod.set({url: '/some/other/url'});
vous êtes en fait l'ajout d'un champ appeléurl
à l'ensemble de données, de sorte que le serveur va envoyer"url": "/some/other/url"
dans le cadre de cette JSON corps POST ci-dessus:Le serveur va ensuite réagir avec un HTTP 200 (ou 201) la réponse avec le même modèle, seul avec, comme, par exemple, et l'ID relié:
Et ce n'est pas ce que vous cherchez, non?)
Maintenant, vous avez ce modèle et qu'il a un ID. Cela signifie que si vous changer:
Épine dorsale maintenant fait une requête HTTP PUT sur
/rest/entry/1
de mise à jour de la ressource sur le serveur.Le serveur voit que vous parlez ID 1 sur le
/rest/entry/
point de terminaison, sait si la mise à jour d'un enregistrement existant (et envoyer un HTTP 200).TL;DR
Ne pas changer l'URL, épine Dorsale de la volonté. Faire un nouveau modèle pour un nouveau morceau de données.
OU
OU
OU
Par défaut 'url' propriété d'une colonne vertébrale.L'objet du modèle est comme ci-dessous. Backbone.js doc a dit:
Clairement, Il obtient tout d'abord la valeur de urlRoot, si pas disponible, il va regarder l'url de la collection à laquelle le modèle appartient. Par définition urlRoot au lieu de l'url a un avantage de retomber url de la collection dans le cas urlRoot est null.
Vous pouvez définir l'url de l'option en fonction d'extraction, comme ceci: