Knockout overriding input value when you haven't specified default value

https://groups.google.com/forum/?pli=1#!topic/knockoutjs/nbYHo5In0tI

by goranobradovic

HTML

<script src="http://knockoutjs.com/js/jquery.tmpl.js"></script>
<script src="http://knockoutjs.com/js/knockout-1.1.2.js"></script>
<input id="messageField" type="text" value="Hello World" data-bind="value: message" />
<div>
    Message: <span data-bind="text: message"></span>
</div>
<hr />
<input type="text" value="Hello World2" data-bind="initializeValue: message2, value: message2" />
<div>
    Message2: <span data-bind="text: message2"></span>
</div>
<hr />
<input type="text" value="Hello World3" data-bind="valueWithInitialize: message3" />
<div>
    Messsage3: <span data-bind="text: message3"></span>
</div>

JavaScript

var viewModel = {
    message: ko.observable(),
    message2: ko.observable(),
    message3: ko.observable()
};

//initialize yourself BEFORE applyBindings
viewModel.message($("#messageField").val());


//custom binding to just handle initializing a value
ko.bindingHandlers.initializeValue = {
    init: function (element, valueAccessor) {
        var value = valueAccessor();
        if (ko.isObservable(value)) {
             value(element.value);   
        }
    }
};

//custom binding that wraps the value binding and does initialization
ko.bindingHandlers.valueWithInitialize = {
    init: function(element, valueAccessor, allBindingsAccessor) {
        var value = valueAccessor();
        if (ko.isObservable(value)) {
            value(element.value);
        }    
        ko.bindingHandlers.value.init(element, valueAccessor, allBindingsAccessor);
    },
    update: function(element, valueAccessor) {
        ko.bindingHandlers.value.update(element, valueAccessor);
    }
}

ko.applyBindings(viewModel);