Search code examples
javascriptknockout.jsknockout-mapping-pluginko.observablearray

ko.mapping observableArray always trigger subscription


I am working with ko.mapping plugin in order to map data coming from an ajax request. Setting the key i expect that subscription is not triggered in this case but it's always raised; i can't understand why. Thx in advance.

var arraySource = [{ Prop: 1, Prop2: 1 }, { Prop: 2, Prop2: 2 }];
var mappedArray = ko.observableArray([]);
mappedArray.subscribe(function (data) {
    console.log(data);
});
window.setInterval(function () {
    ko.mapping.fromJS(arraySource, {
        key: function (data) {
            return data.Prop;
        }
    }, mappedArray);
}, 3000);

Solution

  • As @Andrew Walters suggested the subscription will always be triggered, because the entire array is overwritten with the new content. I found a way to recognoze what really changed by reading the knockout release 3 : http://blog.stevensanderson.com/2013/10/08/knockout-3-0-release-candidate-available/

    var myArray = ko.observableArray(["Alpha", "Beta", "Gamma"]);
    
    myArray.subscribe(function(changes) {
        // For this example, we'll just print out the change info
        console.log(changes);
    }, null, "arrayChange");
    

    inside the subscription it's possible to get the added, deleted and retained elements in a very simple way !