Iterating a knockout observable array in javascript

msrameshp picture msrameshp · May 21, 2013 · Viewed 9.9k times · Source

How Do I iterate an knockout observable array bound to data with knockout js mapping plugin ?. I have created this fiddle to demonstrate my issue. When I try to get the value of the knockout js array object it returns a function instead.

Could anyone please help me out in this matter ?. My Code is as shown below.

//Sample JSON Array
var data =
[{"street":"2532 Falkark Dr", "lat":"39.926295", "lng":"-86.012919",   "zipcode":"92256"},{"street":"8558 Appleby Ln", "lat":"39.922742", "lng":"-86.017637", "zipcode":"92256"}]

function ViewModel() {
var self = this;
self.addresses = ko.observableArray([]); 
ko.mapping.fromJS(data, {}, self.addresses);

}
var viewModel = new ViewModel();

//function binding work order details to view
$(document).ready(function () {
  ko.applyBindings(viewModel);
  gothroughtheObservableArray(viewModel.addresses());
});


function gothroughtheObservableArray(Addressarray)
{
 alert("Got Address Array of length "+Addressarray.length);    

for (var i = 0, len = Addressarray.length; i < len; ++i) {
    var address = Addressarray[i];
    alert(address.street);
}

}

Answer

Benjamin Gruenbaum picture Benjamin Gruenbaum · May 21, 2013

When you use mapping.fromJS it maps properties to observables.

In Knockout when you create an observable in order to gain access to it you invoke its function name.

So when you create

self.addresses = ko.observableArray([]); 

In order to access the underlying array and iterate it (just like any other JavaScript array) you should do

var innerArray = self.addresses();

Exactly like you did. However, since each address is mapped to an observable to, you need to do that when accessing the actual properties of addresses.

Try

    alert(address.street());

(fiddle)