KnockoutJS abonnieren Eigenschaftsänderungen mit dem Mapping-Plugin

Kann ich dem Knockout-Mapping-Plugin trotzdem mitteilen, dass es alle Eigenschaftsänderungen abonnieren soll, um eine bestimmte Funktion aufzurufen?

Mir ist klar, dass ich das Eigenschaftsänderungsereignis folgendermaßen manuell abonnieren kann:

<code>var viewModel = {
    name: ko.observable('foo'),
}

// subscribe manually here
viewModel.name.subscribe(function(newValue){
   // do work
})
</code>

Ich möchte in der Lage sein, generisch zu abonnieren, da meine Ansichtsmodelle variieren können, möchte ich die Eigenschaftsnamen nicht fest codieren. Ich habe eine Funktion erstellt, die dies tut, aber es ist möglicherweise nicht der beste Ansatz. Es funktioniert über alle Browser außer IE7 und darunter.

Hier nehme ich ein Ansichtsmodell als Argument und versuche darüber nachzudenken, indem ich die Eigenschaften abonniere:

<code>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;
    }
</code>

Wie ich bereits sagte, funktioniert dies, aber da ich das Mapping-Plug-In verwende, hatte ich die Hoffnung, dass es einen Hook gibt, mit dem ich ihm eine Funktion zur Verfügung stellen kann, die generisch Eigenschaftsänderungen abonniert.

So etwas wie:

<code>mapping = {
   create: function(options){
       options.data.subscribe(function(newValue){
            // do work ???
       });
   }
}

ko.mapping.fromJS(viewModel, mapping);
</code>

Irgendwelche Ideen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage