Backbone.js : changement de pas de tir sur le modèle.modifier()
Je suis face à un "événement de changement de pas de tir" de l'émission sur Backbone.js =/
Ici mon point de vue de l'Utilisateur modèle :
window.UserView = Backbone.View.extend({
...
initialize: function()
{
this.model.on('destroy', this.remove, this);
this.model.on('change', function()
{
console.log('foo');
});
},
render: function(selected)
{
var view = this.template(this.model.toJSON());
$(this.el).html(view);
return this;
},
transfer: function(e)
{
var cas = listofcas;
var transferTo = Users.getByCid('c1');
var transferToCas = transferTo.get('cas');
this.model.set('cas', cas);
console.log('current model');
console.log(this.model);
//this.model.change();
this.model.trigger("change:cas");
console.log('trigger change');
transferTo.set('cas', transferToCas);
console.log('transferto model');
console.log(transferTo);
//transferTo.change();
transferTo.trigger("change:cas");
console.log('trigger change');
}
});
Ici, le modèle de l'Utilisateur :
window.User = Backbone.Model.extend({
urlRoot: $('#pilote-manager-app').attr('data-src'),
initialize: function()
{
this.set('rand', 1);
this.set('specialite', this.get('sfGuardUser').specialite);
this.set('name', this.get('sfGuardUser').first_name + ' ' + this.get('sfGuardUser').last_name);
this.set('userid', this.get('sfGuardUser').id);
this.set('avatarsrc', this.get('sfGuardUser').avatarsrc);
this.set('cas', new Array());
if (undefined != this.get('sfGuardUser').SignalisationBouclePorteur) {
var cas = new Array();
_.each(this.get('sfGuardUser').SignalisationBouclePorteur, function(value)
{
cas.push(value.Signalisation);
});
this.set('cas', cas);
}
}
});
Dans le modèle Utilisateur, il y a le "cas" de l'attribut, qui est un tableau d'objets.
J'ai lu dans d'autres sujets que les événements de changement ne sont pas le feu sur le modèle.définir si les attributs ne sont pas une valeur.
Alors, j'essaie de déclencher directement l'événement de changement de modèle.changement de méthode.
Mais, je n'ai pas de "foo" journal de ma console ...
- Pour l'instant, j'ai résolu ce problème en ajoutant un 'rand' attribut sur mon modèle. Je l'ai mis à une nouvelle valeur lorsque je veux le feu événement de changement =/
- Heh heh. La solution temporaire qui sonne un peu hacky bien. 🙂 Si votre cas de l'attribut est en effet un attribut sur le modèle de l'Utilisateur, l'évolution de la
User.set({cas:[array]})
doit déclencher l'événement de changement de m'pense. C'est toujours hacky, mais vous pouvez toujours utiliser lemodel.change()
pour déclencher manuellement le changement, et le changement:l'attribut d'événement. Vous n'êtes pas en passant{silent:true}
n'importe où êtes-vous? Pouvons-nous voir votre modèle d'Utilisateur code? - Salut Orangewarp, merci pour votre réponse 🙂 j'ai ajouté le modèle de l'Utilisateur sur le poste, c'est très simple. Comme d'autres ppl dire, de la colonne vertébrale n'a pas de déclenchement d'un événement de changement si l'attribut n'est pas la valeur. Et j'ai déjà essayer de déclencher manuellement le modèle.modifier(), ça ne fonctionne pas comme je l'ai dit ^^
Vous devez vous connecter pour publier un commentaire.
Je suis assez nouveau à l'épine dorsale et j'ai eu ce même problème.
Après avoir fait quelques recherches, j'ai trouvé quelques posts qui ont versé un peu plus de lumière sur les raisons de cette situation, et, finalement, les choses ont commencé à faire sens:
Question 1
Question 2
Le cœur, la raison a à voir avec la notion de référence à l'égalité versus set/membre de l'égalité. Il semble que, dans une large mesure, la référence à l'égalité est l'une des principales techniques de la dorsale utilise pour savoir quand un attribut a changé.
Je trouve que si j'ai recours à des techniques qui génèrent une nouvelle référence de type Array.slice() ou _.clone(), le changement de l'événement est reconnu.
Ainsi, par exemple, le code suivant ne déclenche pas l'événement, car je suis modifiant la même référence de tableau:
Bien que ce code ne déclencher l'événement:
REMARQUE: Selon le Trait de soulignement de l'API, _.clone() des copies de certains éléments imbriqués par référence. La racine/objet parent est cloné, donc il fonctionnera très bien pour la colonne vertébrale. C'est, si votre tableau est très simple et ne possède pas de structures imbriquées par exemple [1, 2, 3].
Alors que mon amélioré le code ci-dessus déclenché le changement, les événements suivants n'est pas parce que mon tableau contenu des objets imbriqués:
Maintenant, pourquoi cette question? Après le débogage très attentivement, j'ai remarqué que dans mon itérateur je faisait référence à la même référence d'objet backbone a stocker. En d'autres mots, j'avais, par inadvertance, a atteint dans les entrailles de mon modèle et renversé un peu. Quand j'ai appelé setLabels(), de la colonne vertébrale correctement reconnu que rien n'a changé car il déjà savait j'ai montré que peu.
Après avoir regardé autour de quelques-uns plus, les gens semblent dire en général que profond des opérations de copie en javascript sont une vraie douleur - rien à faire. J'ai donc fait cela, ce qui a bien fonctionné pour moi - applicabilité générale peut varier:
_.extend({}, this.model.get("labels"))
pouvez également retourner une copie de l'objetIntéressant. J'aurais pensé que
.set({cas:someArray})
aurait tiré un événement de changement. Comme vous l'avez dit, il ne semble pas, et je ne peux pas le faire du feu avec.change()
MAIS, je peux obtenir les événements de travailler si je ne l'model.trigger('change')
oumodel.trigger('change:attribute')
Cela vous permettra de déclencher le changement de l'événement sans que l'aléatoire attribut hack.
Si quelqu'un pouvait expliquer ce qui se passe avec les événements, de la colonne vertébrale, et ce code, qui pourrait m'aider à apprendre quelque chose de trop... Voici un peu de code.
La partie intéressante qui pourrait vous aider:
Je trouve cela intéressant et j'espère que cette réponse va également engendrer certains perspicace explication dans les commentaires que je n'ai pas.
> myShip = new Ship();
> myShip.set('cas',new Array());
> myShip.set({cas: [1,2,3]});
cas changed
general change
> myArray = new Array();
> myArray.push(4,5,6);
> myShip.set({cas:myArray});
cas changed
general change
this.on('change:input.txtclass', this.notify, this);
lorsque j'ai plusieurs zones de texte avec le même événement de changement de<input type="text" class="txtclass"></input>
<input type="text" class="txtclass"></input>
this.notify
. Aussi, vous devriez être en utilisant la plus récente .listenTo plutôt que .à ce point.