KnockoutJS - 带参数的自定义绑定

nom*_*men 14 javascript knockout.js

我正在尝试为一些JavaScript"渲染"函数编写自定义的敲除绑定,以便我可以执行以下操作:

<td data-bind="numeral('0%'): interest">
Run Code Online (Sandbox Code Playgroud)

在幕后,这个假设的数字会做如下:

ko.bindingHandlers.numeral(fmt) = {
  init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContent) {
    var unwrapped = ko.unwrap(valueAccessor()), allBindings = allBindingsAccessor();
    $(element).html(numeral(unwrapped).format(fmt));
  }
} 
Run Code Online (Sandbox Code Playgroud)

我给了这个定义一个go,JavaScript真的不喜欢我试图在数字键上抽象.我应该如何处理这个问题?

Jer*_*eer 30

这里提供的答案是很好的技巧,但淘汰实际上有一种方法可以做到这一点.

<td data-bind="numeral: {interest: interest, fmt: '0%' }"> 
Run Code Online (Sandbox Code Playgroud)

并在您的自定义绑定中:

ko.bindingHandlers.numeral(fmt) = {
  init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContent) {
    var unwrapped = ko.utils.unwrapObservable(valueAccessor());
    // unwrapped.interest... = interest
    // unwrapped.fmt... = fmt ('0%' in this case)

  }
} 
Run Code Online (Sandbox Code Playgroud)

干杯:)

  • 这实际上是这个问题的最佳答案. (4认同)
  • 感谢您添加此答案,即使它是在事后两年.这是一个很好的功能,完全符合我的需求. (3认同)

Jer*_*vak 17

试试这样吧.

<td data-bind="numeral: interest, fmt : '0%'">
Run Code Online (Sandbox Code Playgroud)

和绑定

ko.bindingHandlers.numeral = {
  init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContent) {
    var unwrapped = ko.unwrap(valueAccessor()), allBindings = allBindingsAccessor();
    var fmtVal = allBindings.get('fmt') || '0%'; 
    $(element).html(numeral(unwrapped).format(fmtVal));
  }
} 
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个解决方案有效,但我认为利用allBindings.get()getter来检索另一个自定义绑定的参数值是误导性的.这实质上意味着您有一个名为fmt的绑定,但可能不一定如此.请看下面的替代解决方案. (3认同)

Car*_*nto 5

另一种选择是将自定义数据属性添加到需要绑定的额外参数的元素:

<td data-bind="numeral: interest" data-format="0%">
Run Code Online (Sandbox Code Playgroud)

然后在绑定内部,您可以从元素目标中提取属性的值.

    ko.bindingHandlers.numeral = {
      init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContent) {
           // ... some more code
            var fmtVal = $(element).data("format") || '0%'; 
           // ... do stuff with fmtVal 
    }}
Run Code Online (Sandbox Code Playgroud)


Iva*_*gon 5

您可以作为自定义绑定对象的参数传递.就像是:

<td data-bind="numeral: numeralOptions">
Run Code Online (Sandbox Code Playgroud)

在您的viewmodel中对应的对象:

numeralOptions = {
    interest: ko.observable(808),
    format: '0%'
}
Run Code Online (Sandbox Code Playgroud)

然后在自定义绑定中,使用valueAccessor可以访问您需要的任何初始参数.

var myObject = valueAccessor();
myObject.interest();
myObject.format;
Run Code Online (Sandbox Code Playgroud)