【问题标题】:Get access to Knockout valueAccessor property name获取对 Knockout valueAccessor 属性名称的访问权限
【发布时间】:2016-01-07 21:33:35
【问题描述】:

我需要获取绑定到自定义敲除绑定的敲除视图模型属性的实际名称。考虑以下自定义绑定设置...

HTML

<input type="text" data-bind="myInput: Name" />

Javascript

ko.bindingHandlers.myInput = {
    init: function(element, valueAccessor, allBindingsAccessor, data, context) {
    },
    update: function(element, valueAccessor, allBindingsAccessor, data, context) {
    }
};

var viewModel = {
    Name: ko.observable('Knockout')
};

ko.applyBindings(viewModel);

在自定义绑定处理程序的更新函数的上下文中,我如何知道属性 Name 是正在访问的属性?我不是在寻找 Name 的值(我可以通过 valueAccessor 获得),而是在寻找属性名称本身。

【问题讨论】:

  • 您需要将另一个参数传递给绑定处理程序。但这可能是XY Problem - 您希望通过知道名称来实现什么?绑定处理程序应该通过它的参数做所有事情,它不应该真正访问那些之外的视图模型。
  • 我们有充分的理由需要知道这一点。我发布了一个非常简化的示例,以使问题保持​​清晰和简单。
  • 在这种情况下,答案就是data-bind="myInput: Name, myInputParameter: 'Name'",然后通过allBindingsAccessor 得到它。
  • 或者只是让myInput 取一个属性的名称并同时完成两者的工作。

标签: knockout.js


【解决方案1】:

除了解析元素的data-bind 属性或手动设置属性名称作为绑定参数之外,还有一些奇特的解决方案可以解决您的问题。使用预处理:

ko.bindingHandlers.myText.preprocess = function(value, name, addBindingCallback) {
  if (typeof(value) !== 'undefined') {
    addBindingCallback('myTextBindedTo', "'" + value.replace(/['\\]/g, "\\$&") + "'");
  }
  return value;
}

ko.bindingHandlers.myText.preprocess 为每个带有myText 绑定的元素调用。 value 是data-bind 属性中的绑定值,name 是绑定名称,addBindingCallback 可用于为元素添加另一个绑定。

现在在myText 绑定的update 函数的上下文中,您可以使用allBindings 访问myTextBindedTo。

Fiddle

Documentation

UPD:在代码中添加了检查,因为在跳过绑定值的情况下value 可以是undefined:

<span data-bind="myText"></span>

【讨论】:

  • 很好 - 我不知道这个功能!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多