There are different ways that you could do it.
Here are my opinions the options:
For #1, you would likely not want to do this unless you are using:
https://github.com/hunterloftis/knockout.namespaces. Otherwise, you will potentially get multiiple event handlers bound to some elements or you will error out when one view model does not have the structure that a binding expects from another.
For #2, this is the way that I think works best. The basic idea would be something like:
var viewModel = {
headerModel = ko.observable(...),
contentModel = ko.observable(...),
sidebarModel = ko.observable(...),
footerModel = ko.observable(...)
};
Then, bind your sections using the template binding like:
<div data-bind="template: { name: 'sidebarTmpl', data: sidebarModel }"></div>
The nice part is that if sidebarModel is null, then it just won't render anything. Also, when inside of the template, then you are able to reference your properties directly (for example, title instead of sidebarModel.title). The other part that can be helpful is that you are still able to reference items between the "child" view models either by passing them in through templateOptions or directly if they have global scope.
For #3, if you want to maintain view models in different variables/structures (they do not have the same parent), then this is a good way to do it. You are limited though by the fact that the elements that you bind against can't be ancestors of each other or you can get duplicate bindings. If you did want to share data between view models, you could still accomplish this by adding properties are references between them.
So, I think that any of those methods can work, but #1 would need to be coupled with the namespaces plugin. Hope this helps.