Search code examples
javascriptjqueryjsrenderjsviews

Data-binding in JsViews


I have a Javascript object literal like

test : {
  length: 3,
  text: "Please enter 3 characters"
 }

I want to make the text rendered dynamic based on length, something like this

test : {
      length: 3,
      text: "Please enter {{:length}} characters"
     }

Is there any way to achieve this in JsViews ? I looked at https://github.com/BorisMoore/jsviews/issues/327, but I am not sure if the same approach is applicable in my scenario.


Solution

  • You can try to make a helper format like this

    html

    <div id="result"></div>
    
    <script id="tmpl" type="text/x-jsrender">
      <input type="text" data-link="length"/>
      <br/>
      <span> {^{:~format(text, length)}} </span>
    </script>
    

    js

    var data = {
        length : 3,
        text : "Please enter {0} characters",
    }
    
    var _rxMark = /\{(\d+)\}/g;
    var helpers = {
        format : function (string) {
            var data = [];
            for (var _i = 1; _i < arguments.length; _i++) {
                data[_i - 1] = arguments[_i];
            }
            return string.replace(_rxMark, function (substring, argIndex) {
                var result = data[parseInt(argIndex)];
                return result || "";
            });
        }
    }
    
    var tmpl = $.templates("#tmpl");
    
    tmpl.link("#result", data, helpers);
    

    see example.

    It may also be useful to you here sample.