如何在jsview if语句中使用转换器?

时间:2014-05-02 16:00:55

标签: javascript jquery jquery-ui jsrender jsviews

所以,我只是试图将一个int转换为一个“if”语句中的bool。我不确定如何实现这一目标。我正在玩的代码如下。

JsFiddle code here

HTML:

<div id="main-div"></div>

<script id="testTmpl" type="text/x-jsrender">
    <input data-link="{:test:}" />
    <div data-link="{intToBool:test:}"></div>

    // testing different methods, none seem to work
    {^{if intToBool:test }}
        Woot! 1
    {{/if}}
    {^{if intToBool(test) }}
        Woot! 2
    {{/if}}
    {^{if ~root.intToBool(test) }}
        Woot! 3
    {{/if}}
</script>

JavaScript:

 $.views.converters({
    intToBool: function(val) {
      if (val === 0 || val === false || val === '0' || val === 'false') {
        return false;
      } else {
        return true;
      }
    }
  });

  function App(data) {
    self = this;

    self.test = 0;
  };

  var app = new App();

  var testTmpl = $.templates("#testTmpl");
  testTmpl.link("#main-div", app);

1 个答案:

答案 0 :(得分:2)

注册转换器仅适用于{{: ...}}标记http://www.jsviews.com/#assigntag),其格式为{{cvt:expression}} {^{cvt:expression}} <div data-link="{cvt:expression}"><input data-link="{cvt:expression:cvtBack}" />。请参阅http://www.jsviews.com/#converters

对于其他方案,您需要使用方法{^{if someMethodOnMyModel(test)}}或帮助程序(http://www.jsviews.com/#helpers):{^{if ~someHelper(test)}}

另请参阅http://www.jsviews.com/#samples/jsr/paths有关辅助函数或辅助对象的辅助路径示例 - ~some.expression...。请注意,~root是您传递到render()link()的顶级数据对象的内置辅助路径。

编辑: 实际上 是JsRender和JsViews中一个鲜为人知的功能 让你将注册转换器与其他标签相关联你可以写

{^{if test convert="intToBool" }}
    Woot!
{{/if}} 

但通常使用~intToBool(test)可能更简单/更好 - 这在阅读模板时更为熟悉,也许更容易理解。

同样BTW {{if test}}测试'truthy'所以test不需要是boolean类型。 OTOH如果你想做“假”,或者“0”是假的,那么你确实需要一个助手/转换器。