Thanks for the replies. I spent some time playing around with can.Component and using its scope as a makeshift/implicit ViewModel -- I think I have a much better grasp of this as a whole now.
I ended up making a (rough) demo of a tri-state "select all" checkbox, using components: http://jsfiddle.net/spautz/wKz9g/.
I suspect that fiddle has a lot of room for improvement, but overall I think I'm sold on can.Component and the use of live-binding even for 'intermediate' form values. Thanks for the ideas and suggestions.
--
If anybody's curious, here's a walkthrough of how I went through things:
- Simple case: a checkbox two-way-bound to a 'selectAll' property, which is in turn live-bound to the "checked" attribute of each checkbox. If you manipulate the individual checkboxes, though, it gets out of sync.
http://jsfiddle.net/spautz/wKz9g/7/ - Failed attempt to make things stay in sync: this can handle a little bit of manipulation, but it still breaks if you mess with it enough. I was trying to come up with a solution that had no dom event listeners, but that was a mistake.
http://jsfiddle.net/spautz/wKz9g/9/ - Staying in sync: this uses a can.compute and dom event listener for the "select all" event, instead of trying to use the scope directly. Things stay in sync now, although everything is smushed messily into one component.
http://jsfiddle.net/spautz/wKz9g/10/ - Final (for now): instead of making checkbox-list do all the work, things are now spread across checkbox-list, checkbox-selectall, and checkbox-items. Putting the behavior into one component and the view/template work into the others seemed to work rather well, at least to my eyes.
http://jsfiddle.net/spautz/wKz9g/16/