knockout pass additional parameters to subscription function

ajax, javascript, jquery, knockout.js

Solution

There might be a better way to do this, but the following will work:

First, add a target object to the withUpdate method:

ko.subscribable.fn.withUpdater = function (handler, target, propname) {
    var self = this;   

    var _oldValue;
    this.subscribe(function (oldValue) {
      _oldValue = oldValue;
    }, null, 'beforeChange');

   this.subscribe(function (newValue) {
     handler.call(target, _oldValue, newValue, propname);
   });

       return this;     
};

The update subscribe function will get scoped to the target property:

var update = function (propertyName) {
   console.log('propname is '+ propname + ' old val: ' + oldvalue + ', new val: ' +  newvalue + ', model id: ' + this.ModelId());
}

Now you will need to use it a little differently.

  self.CompanyName = ko.observable().withUpdater(update, self, "CompanyName");

An example http://plnkr.co/edit/HhbKEm?p=preview

I couldn't get the scope of the withUpdater function to be that of the object without explicitly passing in the target and a string for the company name.

Problem

What I want to achieve is to create subscription for model properties. This subscription function should call WebApi via Ajax updating property value in database. For ajax call I need three paramaters: "`fieldName`", "`fieldValue`" and "`modelId`", ajax will update database row based on those three parameters. I have many properties and all of them need the same functionality, so I do not want to subscribe for each property individually, so I found a following suggestion: ``` ko.subscribable.fn.withUpdater = function (handler) { var self = this; this.subscribe(handler); //support chaining return this; }; ``` Add this is how it is "attached" to observables: ``` self.ModelId= ko.observable(); self.CompanyName = ko.observable().withUpdater(update); ``` where `update` is some js function outside model. However, I have problem, because I am not able to pass three paramaters to `update` functions (or also I can say in another words - I need to be able to get `viewModel.ModelId` property value inside `update`, as well as `propertyName`). ``` function update (propertyName, propertyNewValue, anotherPropertyValue) { //do ajax update } ``` As an example for CompanyName property it will be: ``` update("CompanyName", "New Company value here", 3), ``` where ``` 3 == viewModel.ModelId ```

Original source