liaison d'événements dans knockout.js
J'ai un viewModel avec un tableau de answerGroup objets. Lorsque le retour de la propriété de l'un des answerGroup objets est mise à jour, je veux économiser de l'objet mise à jour de ma base de données en passant par l'ajax à mon ASP.Net MVC app.
Au lieu d'avoir un enregistrement standard bouton ou un lien, je veux de l'objet à transmettre à l'appel Ajax lorsque la propriété de l'objet a été mis à jour. Je pensais que je pouvais le faire en se liant à l'événement de changement de l'élément textarea mais si je fais cela, l'ajax fonction est appelée, mais les sous-jacents answerGroup de l'objet de commentaires de la propriété n'est pas mis à jour.
Je suis en utilisant le knock-out 1.2.1. Ci-dessous est le code JavaScript, je n'ai pas inclus le code HTML.
Je suis aller sur ce de la mauvaise façon ou est-il juste que ma syntaxe pour l'knockout.js liaison d'événement est incorrect?
<script>
var viewModel = {}
$(function () {
viewModel.scenarioId = ko.observable($("#Scenario_ScenarioID").val());
viewModel.answerGroups = ko.observableArray([]);
viewModel.addGroup = function (answerGroup) {
//add item to beginning of array
this.answerGroups.unshift(answerGroup);
};
ko.applyBindings(viewModel);
});
function answerGroup() {
this.id = ko.observable();
this.name = ko.observable();
this.feedback = ko.observable();
//the groups feedback has been updated so save
//these details back to the server
this.updateGroup = function (event) {
//javascript api library that is an ajax function.
//this works without a problem.
api.updateAnswerGroup({
success: function (result) {
alert("saved!");
},
error: function (e) {
alert("error!");
},
data: "answerGroupId=" + this.id + "&feedback=" + this.feedback
});
return true;
};
}
</script>
<script id="answerGroupsTemplate" type="text/html">
<div>
<h4><a href='#'>${ $data.name }</h4>
<div>
<textarea cols="100" rows="2" data-bind="event: { text: feedback, change: updateGroup }">
</textarea>
</div>
</div>
</script>
- peut-être que je suis paresseux, mais je pense que c'est trop de code. dont une partie est la partie pertinente de l'
- Ibu - tout cela est pertinent, je n'ai pas inclus le irrelavant pièces.
- Le updateGroup fonction est appelée, mais la valeur sous-jacente de la rétroaction de la propriété n'est pas mis à jour. J'ai besoin de la rétroaction de la propriété pour mettre à jour puis la updateGroup fonction à appeler afin que je puisse passer la valeur de cette propriété sur le serveur.
Vous devez vous connecter pour publier un commentaire.
Typique de la façon de les traiter dans knock-out est de faire un manuel d'abonnement sur les observables que vous voulez réagir aux changements.
Donc, vous voulez faire quelque chose comme:
Le deuxième paramètre de la fonction subscribe contrôle le contexte ("ce") lorsque la fonction s'exécute.
La belle partie de l'abonnement de ce genre est qu'il se déclenche lors de l'observable est modifiée par programmation ou modifié en fonction d'une liaison dans votre INTERFACE utilisateur.
Brève de docs sur le sujet ici: http://knockoutjs.com/documentation/observables.html#explicitly-subscribing-to-observables
J'ai eu un message qui comprenait des informations sur l'utilisation du manuel des abonnements ici trop.
Espère que cette aide.
myObservable(myValue)
plutôt quemyObservable = myValue
. Sinon, vous êtes la réinitialisation de la variable àmyValue
plutôt que de définir la observables à cette valeur. jsfiddle.net/rniemeyer/Sm65u/6Je préfère vous abonner à la observables comme la façon RP Niemeyer décrit, mais parfois vous avez besoin pour attacher à un événement et non observables. Par conséquent, vous pouvez utiliser le "cas" de liaison. La documentation ne comprend pas le "changement" de l'événement, mais j'ai essayé avec la version v2.0.0 rc et ça fonctionne:
http://knockoutjs.com/documentation/event-binding.html