PhillyNJ
PhillyNJ

Reputation: 3901

Make all properties in an array observable

I have an array coming back from an ajax request. I bind this array to an observableArray in knockout. I would like to know how I can iterate over the array prefixeData and make each of the element's properties observable. Is this possible?

var viewModel = {
            name: "Editor",                
            prefixeData: ko.observableArray([]),                
            getPrefixes: function (prefix) {                    

                var params = {
                    "prefix": prefix
                };

                $.ajax({

                    type: "POST",
                    url: "XXXX.aspx/GetPrefixes",
                    data: JSON.stringify(params),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    async: false,
                    success: function (data) {
                        var trans = data.d;
                        if (trans.Successful) {

                          viewModel.prefixeData(trans.ResultObject);
                            // this doesnt work
                          viewModel.prefixeData().forEach(function(data) {
                                data.LevelName=ko.observable(data.LevelName);

                            });
                        } else {
                            //todo
                        }

                    },
                    error: function (xhr, textStatus, err) {

                        alert("Status: " + textStatus); alert("Error: " + err);

                    }

                });
            }
        };

Upvotes: 0

Views: 121

Answers (1)

Hua Trung
Hua Trung

Reputation: 1899

u need import knockout.mapping knockout.mapping

and edit your code like:

success: function (data) {
                        var trans = data.d;
                        if (trans.Successful) {
                         var observableArray = ko.mapping.fromJS(trans.ResultObject);
                         viewModel.prefixeData(observableArray());
                        //viewModel.prefixeData now is observableArray, you can call foreach : viewModel.prefixeData at html
                        } else {
                            //todo
                        }

                    },

Upvotes: 1

Related Questions