Knockout JS - data-bind multiple values

15,850

You cant bind multiple variables directly but creating a custom bind function do the trick for you.

Example : http://jsfiddle.net/gurkavcu/ePW8Y/
** Change input value (true , false) to trigger the update function

HTML

<input data-bind="customData: test , v1 : test2"/>
<div>
    <span data-bind ="text : test"/>
</div>
<div>
    <span data-bind ="text : test2"/>
</div>

JS

ko.bindingHandlers.customData = {
      init: function(element, valueAccessor, allBindingsAccessor, viewModel) {  
           $(element).change(function () {
                valueAccessor()(element.value);
            });       
      },
       update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
          var value =ko.utils.unwrapObservable(valueAccessor());
          var v1 = allBindingsAccessor().v1;

          if(value === "true") {
             v1("1"); 
             console.log(v1());
          }
          else  if(value === "false") {
             v1("2"); 
             console.log(v1());
          }
     }
};  


function ViewModel() {

    this.test =  ko.observable(false);
    this.test2 =  ko.observable("2");

};

$(function() {  

    var viewModel = new ViewModel();
    ko.applyBindings(viewModel); 

})​

Modify the update function for your needs. You can add any number of variable to the binding with v1 : ... , v2 : ... , v3 : ... and access it via allBindingsAccessor().v1 , allBindingsAccessor().v2 , allBindingsAccessor().v3

Share:
15,850

Related videos on Youtube

user1436111
Author by

user1436111

Updated on June 04, 2022

Comments

  • user1436111
    user1436111 about 2 years

    Question about JS Knockout library - I have three inputs, all data-Bind-ed to the same variable. Two have a boolean value of false and one has a boolean value of true. (I can't change them to ints, unfortunately, which would make this problem easier). Although the two false-valued inputs share behavior, I need to differentiate between them somehow to trigger slightly different behaviors.

    Is it possible to data-bind each to another variable, with different values? So instead of each being

        <input data-Bind="checked:test" value="false">
    

    I would have something like

        <input data-Bind="test, test2" value="false, 1">
    

    and

        <input data-Bind="test, test2" value="false, 2">?
    

    I tried that directly and didn't work so I don't know if it's possible. Thanks so much.

    • Kyeotic
      Kyeotic almost 12 years
      So, none of those bindings are valid, and I'm not entirely sure what you are trying to do, or how you expect this to behave. If the value of test1 updates, and doesn't match test2 what would you want to happen? You might be able to achieve this with computed observables, but you cannot bind to two properties like this. And I don't know why you would want to.