如何在Knockout JS中的BindingHandler中获取绑定表达式

Sim*_*mon 6 javascript data-binding knockout.js

让我们说我有一个限制范围

<span data-bind="MyBinding: Name"></span>
Run Code Online (Sandbox Code Playgroud)

我有一个自定义绑定

ko.bindingHandlers.MyBinding = {
   init: function (element, valueAccessor, allBindings, viewModel, context) {
        // I want to get the string "Name" here. NOT the value of Name.
   },
};
Run Code Online (Sandbox Code Playgroud)

如何在处理程序中获取带有绑定表达式值的字符串?即如何获得"名称"而不是"名称的价值".

我还需要表达式,所以传递字符串"Name"是不可行的.

<span data-bind="MyBinding: 'Name'"></span>
Run Code Online (Sandbox Code Playgroud)

Tyb*_*itz 2

事实上,Knockout确实有一个内置的方法来做到这一点。您确实需要稍微调整一下自定义绑定(即,它变成一个对象而不是字符串值)。Knockout 允许您与initupdate属性一起指定preprocess属性。例如,假设我们有以下 viewModel:

var app = { data: ko.observable('Hello World') };
Run Code Online (Sandbox Code Playgroud)

一个简单的绑定会将传递给它的字符串完全转换为小写,并输出绑定的名称和值(视图中传递的属性显然是data):

ko.bindingHandlers.lower = {
  update: function(elem, value) {
    var obj = ko.unwrap(value());
    elem.textContent = 'Name: ' + ko.unwrap(obj.name) + 
      ' - Value: ' + ko.unwrap(obj.data).toLowerCase();
  },
  preprocess: function(value, bindingName) {
    return '{data:' + value + ', name:\'' + bindingName + '\'}';
  }
};
Run Code Online (Sandbox Code Playgroud)

它就像对传递value给它的属性进行字符串化并将绑定的值转换为具有 2 个键的对象(此处为名称和值)一样简单。看一看。有关详细信息,请参阅绑定预处理。