Knock-out changements observables pas détecté si la valeur a changé de l'extérieur
J'ai une liste des zones de texte liées à la ko.observableArray
.
Je dois veiller à ce que les valeurs de zone de texte ne peut pas être vide, et je le fais avec jQuery par le réglage de la valeur à 0 si c'est vide sur blur()
Le problème est que le changement de valeur fait avec jQuery n'est pas enregistré par knock-out.
Comment dois-je observer la variation de la valeur de mon modèle?
Voir mon simplifié de violon pour obtenir le point à travers -
http://jsfiddle.net/k45gd/1/
HTML
<input type="number" data-bind="value: age" />
<span data-bind="text: age"></span>
<button data-bind="click: setAgeExternally">I want the label to change to 0</button>
JS
var model = function() {
this.age = ko.observable(21);
//this code is outside of the model, this is oversimplification
this.setAgeExternally = function(){
$('input').val(0);
}
};
ko.applyBindings(new model());
OriginalL'auteur roman m | 2013-04-06
Vous devez vous connecter pour publier un commentaire.
Dans l'exemple que vous fournissez, vous êtes à la mise à jour de la zone de saisie avec ce code:
Considérant que l'entrée est lié à l'âge de la propriété, il serait plus simple de le faire:
Cependant, ce n'est même pas vraiment nécessaire, comme l'âge de la propriété est exposée sur votre viewmodel. Donc le code externe pourrait juste faire cela, et les setAgeExternally méthode n'est pas vraiment nécessaire:
Nous allons revenir à votre problème d'origine - celui que vous décrivez, mais ne poste pas de code pour. Vous mentionnez que vous avez une liste de boîtes de saisie lié à un observables tableau.
Il est intéressant de gotcha, vous devez être conscient de lorsque vous travaillez avec une observable tableau:
À partir de la documentation à http://knockoutjs.com/documentation/observableArrays.html:
Étant donné les exigences de votre liste, il n'y a pas besoin de jQuery à tous. Vous pouvez essayer cette troisième partie de la solution:
Faire de votre observableArray contiennent des observables. Donc, si vous voulez retrouver avec quelque chose comme:
Ensuite, créez un knock-out extender qui remet à 0 automatiquement si le champ est vide
Appliquer le multiplicateur à l'observables dans votre tableau
De travail violon: http://jsfiddle.net/tlarson/GF3Xe/
OriginalL'auteur CodeThug
Vous avez besoin de deux choses:
Après la modification de la valeur de l'élément avec jQuery, vous devez laisser knock-out savoir pour mettre à jour le modèle. Vous pouvez le faire par le déclenchement d'une
change
événement:Pour knock-out (avant 3.1.0) pour répondre à jQuery événements, il a besoin de savoir que vous êtes à l'aide de jQuery. Pour cela, vous devez inclure jQuery dans votre document avant de knock-out.
Voici votre violon avec deux mises à jour: http://jsfiddle.net/mbest/k45gd/2/
OriginalL'auteur Michael Best
Utilisés Michael Meilleure suggestion:
C'est le code qui a fonctionné pour moi:
Thx MO, sauvé mon temps... 🙂
OriginalL'auteur SAZZ