Knockback.js has a helper called kb.ViewModel to automatically generate observables for each attribute
Most likely you will use the kb.viewModel(model) factory method to create a kb.ViewModel.
warning Unless you specify otherwise, a kb.ViewModel creates an observable for every attribute (including the id) which can cause performance issues on a page with many models. It is recommended to get started quickly with kb.ViewModels and then optimize with specialized classes like kb.Observable and kb.CollectionObservable.
If Knockback encounters a attribute that is a Backbone.Model, it automatically creates a kb.ViewModel for it. Because the model can change behind the scenes, you must access the view model using the 'attribute_name()' syntax rather than as a simple property.
<div id='kbvm_bb_model'> <p> <span>First Person: </span> <input data-bind="value: name"/> </p> <p> <span>Second Person: </span> <input data-bind="value: friend().name"/> </p> <p> <span>Person: </span> <span data-bind="text: name"></span> <p> <span>Has this friend: </span> <span data-bind="text: friend().name"></span> </p> </div>
bob = new Backbone.Model({name: 'Bob', friend: new Backbone.Model({name: 'Fred'})}) view_model = kb.viewModel(bob) ko.applyBindings(view_model, $('#kbvm_bb_model')[0])
// Generated by CoffeeScript 1.3.3 var bob, view_model; bob = new Backbone.Model({ name: 'Bob', friend: new Backbone.Model({ name: 'Fred' }) }); view_model = kb.viewModel(bob); ko.applyBindings(view_model, $('#kbvm_bb_model')[0]);
First Person:
Second Person:
Person:
Has this friend:
If Knockback encounters a attribute that is a Backbone.Collection, it automatically creates a kb.CollectionObservable for it and a kb.ViewModel for each of it's models. Because the collection can change behind the scenes, you must access the collection observable using the 'attribute_name()' syntax rather than as a simple property.
<div id='kbvm_bb_collection'> <p> <span>First Person: </span> <input data-bind="value: name"/> </p> <p> <span>Second Person: </span> <input data-bind="value: friends()[0].name"/> </p> <p> <span>Third Person: </span> <input data-bind="value: friends()[1].name"/> </p> <p> <span>Person: </span> <span data-bind="text: name"></span> <p> <span>Has these friends: </span> <ul data-bind="foreach: friends"> <li data-bind="text: name"></li> </ul> </p> </div>
bob = new Backbone.Model({name: 'Bob', friends: new Backbone.Collection([new Backbone.Model({name: 'Fred'}), new Backbone.Model({name: 'John'})])}) view_model = kb.viewModel(bob) ko.applyBindings(view_model, $('#kbvm_bb_collection')[0])
// Generated by CoffeeScript 1.3.3 var bob, view_model; bob = new Backbone.Model({ name: 'Bob', friends: new Backbone.Collection([ new Backbone.Model({ name: 'Fred' }), new Backbone.Model({ name: 'John' }) ]) }); view_model = kb.viewModel(bob); ko.applyBindings(view_model, $('#kbvm_bb_collection')[0]);
First Person:
Second Person:
Third Person:
Person:
Has these friends: