Search code examples
knockout.jsknockout-2.0knockout-mapping-plugin

observe only specific property of object for every object in an observableArray


I know about 'Drilling down into arrays/objects' from the documentation ( http://knockoutjs.com/documentation/plugins-mapping.html ), but I want this to work for every object in an array of objects, not only for one index like in the example

var data = {
    a: "a",
    b: [{ b1: "v1" }, { b2: "v2" }] 
};
var result = ko.mapping.fromJS(data, { observe: "b[0].b1"});

Is there a way to do this or do I have to run through the array and do it manually anyway? (then I wouldn't need the mapping plugin to begin with).


Solution

  • You cannot do this with the "drilling down" syntax but you can nest the mapping configurations using the create option:

    var result = ko.mapping.fromJS(data, {
        observe: " ", // to copy every other property, a in this example 
        b: {
            create: function (options) {
                return ko.mapping.fromJS(options.data, {
                    observe: "b1"
                });
            }
        }
    });
    

    Demo JSFiddle.

    Using this only the b1 properties will be observable:

    enter image description here