Ok, j'ai essayé de démêler ce gâchis pour quelques heures maintenant et ont obtenu nulle part, analogue à un chien court après sa queue. Voici la situation.
Je suis à l'aide d'Knockout.js pour mon UI, qui fonctionne très bien par lui-même. Cependant, je suis en train d'utiliser la troisième partie du code qui fait des listes déroulantes et des cases à cocher pour un look de jolie. En fait, je ne suis même pas sûr si c'est un tiers de la bibliothèque ou tout simplement quelque chose de nos designers a écrit. Ce code se cache la vraie case à cocher et le remplace par un faux <span />
qui imite une case à cocher par CSS. L' click
événement de la durée de déclencheurs de l' change
cas de la vraie case à cocher:
// this code updates the fake UI
this._changeEvent = function() {
self.isChecked = self.$input.is(':checked');
self._updateHTML(false, true);
jQuery(self).trigger('change');
};
// when the user clicks the fake checkbox, we trigger change on the real checkbox
this.$fake.on('click', function(e) {
e.preventDefault();
self.$input.click().trigger('change');
});
// Bind _changeEvent to the real checkbox
this.$input.change(this._changeEvent);
Cela fonctionne avec Knockout.js depuis knock-out sera à l'écoute de ce gestionnaire d'événement. En d'autres termes, lorsque l'utilisateur clique sur le faux case, le knock-out lié modèle est mis à jour. Cependant, ce n'est pas le travail est la mise à jour du modèle. Si je l'appelle:
model.SomeValue(!curValue); // SomeValue is bound to a checkbox, flip its value
Le modèle est mis à jour, mais le faux de l'INTERFACE utilisateur n'est pas mis à jour. J'ai tracé ce problème pour le code en ko.bindingHandlers.checked.update
qui effectue les opérations suivantes:
// When bound to anything other value (not an array), the checkbox being checked represents the value being trueish
element.checked = value;
Fondamentalement, l' element.checked
propriété est définie, mais pas les événements sont déclenchés. Ainsi, l' _changeEvent
fonction n'est jamais appelée. Donc, j'ai mis en place mon propre ko.bindingHandlers.checked.update
de la fonction, qui est une copie de l'intégré. En théorie, c'est tout ce que je besoin de le faire:
ko.bindingHandlers.checked.update = function (element, valueAccessor)
{
var value = ko.utils.unwrapObservable(valueAccessor());
if (element.type == "checkbox")
{
if (value instanceof Array)
{
// When bound to an array, the checkbox being checked represents its value being present in that array
element.checked = ko.utils.arrayIndexOf(value, element.value) >= 0;
}
else
{
// When bound to anything other value (not an array), the checkbox being checked represents the value being trueish
//element.checked = value;
$(element).prop('checked', value).trigger('change'); // <--- this should work!
}
}
else if (element.type == "radio")
{
element.checked = (element.value == value);
}
};
Plutôt que de fixer element.checked
, j'ai plutôt appel .prop('checked', value)
et de déclencher le changement de l'événement. Toutefois, cela ne fonctionne pas. Voici ce que je sais:
- Si je supprime Knockout.js à partir de l'équation,
$(element).prop('checked', value).trigger('change');
fonctionne parfaitement bien. Donc, knockout.js est vissage avec l'événement d'une façon. Est-il délier de ce gestionnaire d'événement? - J'ai confirmé
$(element)
est la même chose quethis.$input
dans le faux case code de liaison. Je peux mettre d'autres expando les propriétés de cet élément, et qu'ils se présentent. - J'ai tenté quelques approches pour essayer de déboguer dans Knockout.js et jQuery pour voir si l'événement est encore lié, cependant, je n'ai pas vraiment obtenu de n'importe où avec cette approche. Mon intuition est que Knockout.js en quelque sorte remplacé l'
change
gestionnaire d'événement avec son propre interne, et les liaisons existantes ont été supprimées. Je n'ai pas trouvé un moyen de le confirmer encore.
Ma Question: Principalement, je suis à la recherche d'une solution à ce problème. N'Knockout.js supprimer existants change
événements qui étaient là avant, le modèle a été appliqué? Quelles sont les prochaines étapes dans le débogage de ce code et de comprendre exactement ce qui se passe?