9

How can i update the complete viewModel ?

  1. On page load i get a Model and convert that using ko.mapping.fromJS(myObject) to a viewModel.
  2. If the user clicks a button i want to get updated data from the server
  3. Now i want to apply theese updates

If i use ko.applyBindings(viewModel); it updates the ui perfectly. But it adds the same events again. So if the user clicks the button, the event gets fired twice, third and so on.

Question

What is a good way to update my complete viewModel. Maybe i remove the bindings and apply them again ? (how to do this).

Sample

var viewModel; function update() { $.ajax({ url: '...', type: "GET", statusCode: { 200: function (data) { viewModel = ko.mapping.fromJS(data); ko.applyBindings(viewModel); } } }); } // first call after page load update(); // user click $("#myButton").click(function() { update(); }); 

Update

Steve Greatrex Could you post your custom binding implementation?

ko.bindingHandlers.domBinding = { init: function (element, valueAccessor, allBindingsAccessor, viewModel) { viewModel.domElement = element; }, update: function (element, valueAccessor, allBindingsAccessor, viewModel) { viewModel.domElement = element; }, }; 
1
  • Could you post your viewModel code as well? Is domElement an observable? Commented Aug 3, 2012 at 9:20

2 Answers 2

10

If you look at the 'Specifying the update target' on the mapping documentation, you can specify a target for the mapping.

This should mean that you can say:

if (!viewModel) viewModel = ko.mapping.fromJS(data); else ko.mapping.fromJS(data, {}, viewModel); 

This way you will create a view model on the initial load, then update that view model for any subsequent loads.

Sign up to request clarification or add additional context in comments.

7 Comments

+1 This works nice. But one thing does not work. I have a customBinding and this does not get updated (stopped working). Any idea ?
Could you post your custom binding implementation?
@dknaack: Make sure you don't call ko.applyBindings a second time. You should only ever call that once per view.
Can you give me an example of how you then data-bind? ex: data-bind="viewModel" ?
@Vyache you wouldn't need to change your data bindings after the update - they would automatically be updated
|
3

Using mapping plugin I did this

ko.mapping.fromJS(JsonResponse, myObservable()); 

That's all.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.