5 votes

Détruire un objet dans Knockout.

Je garde la trace des objets supprimés dans un observableArray appelé 'Deletions'. J'analyse ce tableau dans l'interface utilisateur pour créer des liens "Annuler la suppression", mais je n'arrive pas à le faire fonctionner. Le code est très simple et ressemble à ceci :

this.removePage = function(page){
    self.formBuilder.pages.destroy(page);
    var newDeletion = new Deletion();
    newDeletion.element(page);
    self.deletions.push(newDeletion);
}

this.removeFormElement = function(element){
    self.formElements.destroy(element);
    var newDeletion = new Deletion();
    newDeletion.element(element);
    builder.deletions.push(newDeletion);
}

var Deletion = function(){
    var self = this;
    this.element = ko.observable();
};

Notez que différents types d'éléments peuvent être ajoutés à l'observableArray Deletions. La seule chose que je dois faire dans la fonction 'unremove' est de mettre l'indicateur 'destroy' à false. Mais je n'arrive pas à le faire fonctionner :

this.unremovePage = function(deletion){
    deletion.element()._destroy(false);
}

Quelle est la bonne façon de procéder ?

EDITAR

Je n'arrive pas à le faire fonctionner pour les FormElements imbriqués. La structure est la suivante : mon ViewModel principal s'appelle 'FormBuilder'. Le FormBuilder a plusieurs pages (qui sont elles-mêmes des ViewModels) et chaque page a plusieurs FormElements (voir l'extrait de code ci-dessus).

Je peux "annuler" ces FormElements, mais je n'ai aucune idée de la façon de forcer un rafraîchissement sur eux.

this.unremove = function(deletion){
    //console.log(deletion.element);
    deletion.element()._destroy = false;
    self.deletions.remove(deletion);
    self.formBuilder.pages.valueHasMutated(); // works
    deletion.element().valueHasMutated(); // this doesn't work 
    self.formBuilder.pages.indexOf(deletion.element()).valueHasMutated(); // neither does this
    self.deletions.valueHasMutated(); // works
};
  • FormBuilder est le ViewModel principal ;
  • FormBuilder a un observableArray appelé Pages, chaque Page est un ViewModel ;
  • Chaque page possède un observableArray appelé FormElements, chaque FormElement est un ViewModel ;
  • FormBuilder a un observableArray appelé Deletions, chaque Deletion est un ViewModel et chaque Deletion contient un élément, soit une Page ou un FormElement.

Le problème : J'utilise la fonction 'unremove' pour mettre la propriété 'destroy' de l'élément (soit Page ou FormElement) à false. Comme vous pouvez le voir, j'appelle ensuite 'valueHasUpdated' sur les pages. Mais comment puis-je appeler cela sur l'observableArray formElements telle que contenue dans une page individuelle ?

7voto

RP Niemeyer Points 81663

_destroy n'est pas une observable. Donc, ce que vous pouvez faire c'est mettre _destroy à false et ensuite appeler valueHasMutated sur l'observableArray, afin que les abonnés (l'interface utilisateur) sachent qu'ils devront peut-être effectuer des mises à jour.

Donc, vous voudriez deletion.element()._destroy = false; et ensuite appeler self.deletions.valueHasMutated() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X