2014-10-16 32 views
2

在WPF中有一个绑定,我用了很多;Knockout字符串格式模式

<GridViewColumn DisplayMemberBinding="{Binding Path=Price, StringFormat=Now {0:c}!}"/> 

是否有一种很好的方法来实现类似的基因敲除?我正在使用一个sprintf库,这将很好用。

我想我可以创建自定义此绑定的,但是我想我会在这里检查试图重新发明轮子之前,这应该是一个相当普遍的要求。

一个用例是动态地建立的a标签的href属性,例如产生这样的事情:

<a href="#products/1/product/2">Foo</a> 

其中1是产品组和2是一个产品的ID

+0

,这可能是有用的:http://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format – Tanner 2014-10-16 10:50:25

回答

4

因为要格式化的显示(UI)的值,并跟随其变化,一自定义绑定调用您的sprintf库是最合适的解决方案,它提供了可重用性也,例如:

ko.bindingHandlers.sprintf = { 
    update: function(element, valueAccessor) { 
     var options = valueAccessor(); 
     var formatted = sprintf(ko.unwrap(options.format), 
           ko.unwrap(options.args).map(function(arg) { 
            return ko.unwrap(arg); 
           }); 
     if(options.attr) { 
      element.setAttribute(options.attr, formatted); 
     } else { 
      element.textContent = formatted; 
     } 
    } 
} 

这个地方自定义绑定需要具有以下性质的配置对象:

  • attr:所述属性来更新(NULL,如果元素的文本内容是更新)
  • format:字符串格式
  • args:格式ARGS

用法:

<a data-bind="sprintf: { attr:'href', 
         format:'#products/%0/product/%1', 
         args: [val1, val2] }"> 
    click 
</a> 
// val1 & val2 are ko observables 

但你也可以内data-bind直接使用sprintf

<a data-bind="attr: { href: sprintf('#products/%0/product/%1', 
            [val1(), val2()]) 
        }"> 
    click 
</a> 

演示:JSFiddle

+1

真棒,点上我想要的东西:) – havardhu 2014-10-16 11:09:43

+0

@havardhu,不客气。 – manji 2014-10-16 11:18:48