KnockoutJS s'abonner à des modifications de la propriété avec la Cartographie Plugin
Est-il de toute façon je peux dire le knock-out plugin de cartographie de s'abonner à toutes les modifications de propriété appeler une fonction?
Je me rends compte que je peux manuellement vous abonner à la propriété de modifier l'événement de cette manière:
var viewModel = {
name: ko.observable('foo'),
}
//subscribe manually here
viewModel.name.subscribe(function(newValue){
//do work
})
Je voudrais être en mesure de génériquement abonnez-vous si, depuis mon point de vue, les modèles peuvent varier, je ne veux pas coder en dur les noms de propriété. J'ai créé une fonction qui fait cela, mais il peut ne pas être la meilleure approche. Il fonctionne sur tous les navigateurs, sauf internet explorer 7 et ci-dessous.
Ici, je prends un dernier comme d'un argument et d'essayer de réfléchir à cela s'abonner à la propriétés:
function subscribeToKO(data) {
$.each(data, function (property, value) {
if (getType(value) == "Object")
data[property] = subscribeToKO(value);
else if (getType(value) == "Array") {
$.each(value, function (index, item) {
item = subscribeToKO(item);
});
}
else {
if (value.subscribe) {
value.subscribe(function (newValue) {
//do work
});
}
}
});
return data;
}
Comme je l'ai dit, cela fonctionne, mais depuis que je suis à l'aide de la cartographie pluging j'espérais qu'il y a un crochet je pourrais utiliser pour fournir une fonction qui va génériquement abonnez-vous à des changements de propriété.
Quelque chose comme:
mapping = {
create: function(options){
options.data.subscribe(function(newValue){
//do work ???
});
}
}
ko.mapping.fromJS(viewModel, mapping);
Des idées?
Vous devez vous connecter pour publier un commentaire.
Voici une approche générique basé sur Ryan Niemeyer drapeau sale.
Cliquez ici pour le JsFiddle.
Html:
Javascript:
À portée de main ce petit plugin est assez proche de ce que vous avez fait, mais il est livré avec plusieurs options et peuvent fonctionner sur un ensemble beaucoup plus vaste de besoins sans nécessiter de plugin de Cartographie:
https://github.com/ZiadJ/knockoutjs-reactor
Fondamentalement, il vous permet de vous écrire ce genre de code: