knockout viewmodel property undefined

http://stackoverflow.com/questions/9281196/knockout-viewmodel-property-undefined

by rniemeyer

HTML

<script src="http://github.com/downloads/SteveSanderson/knockout/knockout-2.0.0.js"></script>
<div id="customersArea" data-bind="foreach: people">
    <div class="section" data-bind="attr: { 'personid': PersonId }" >
        <div class="sectionText">
            <span data-bind="text: PersonId"></span>
            <span data-bind="textWithInit: 'LastName'"></span>
            <span data-bind="textWithInit: 'FirstName'"></span>
            <span data-bind="if:$data.MailingAddress">
                <span data-bind="with:MailingAddress">
                    <span data-bind="text:StreetPartOne"> </span>
                    <span data-bind="text:StreetPartTwo">  </span>
                    <span data-bind="text:City"></span>
                    <span data-bind="text:PostalCode"></span>
                </span>
            </span>

            <span data-bind="textWithInit: 'EmailAddress'"></span>
            <span data-bind="textWithInit: 'MainPhoneNumber'"></span>
            <span data-bind="textWithInit: 'MobilePhoneNumber'"></span>
        </div>
    </div>
</div>
<hr/>

CSS

.selected { background: #ccc; }

JavaScript

//rewrite binding after making sure that it is initialized
ko.bindingHandlers.textWithInit = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        var value = valueAccessor();

        if (!ko.isObservable(viewModel[value])) {
            viewModel[value] = ko.observable(viewModel[value]);   
        }
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        ko.bindingHandlers.text.update(element, function() { return viewModel[valueAccessor()]; });
    }
};

var viewModel = {
    people: ko.observableArray([
    { PersonId: 33, LastName: 'frank' }        
    ])        
};    
   

ko.applyBindings(viewModel);