【问题标题】:Get name of property as string instead of property value?获取属性名称作为字符串而不是属性值?
【发布时间】:2014-08-05 09:30:13
【问题描述】:

在绑定处理程序中,如果我有如下绑定:

<div data-bind="someHandler { value : valueOnModel }"></div>

我的绑定处理程序的以下代码:

class someHandler : KnockoutBindingHandler {
  init(element, valueAccessor, allBindingsAccessor, data, context) {
    var va = valueAccessor();
    var value = va.value;
    //How to get "valueOnModel" here??
    var valuePropertyName : string;

    var isVisible = data[valuePropertyName + "_isVisible"];
  }
}

上面是我想要实现的,但是不知道上面的valuePropertyName怎么设置?

任何帮助表示赞赏:)

【问题讨论】:

  • 所以你想获取属性名而不是值?
  • @Stefan 是的,类似于反射的概念——我正在尝试在绑定处理程序上设置一些通用功能
  • @LukeHennerley 您是否尝试过任何答案或使用过您自己的解决方案?

标签: javascript jquery knockout.js typescript


【解决方案1】:

好吧,我的回答可能看起来不那么优雅,只是一个想法 - ko 用 function() { ... } 内部值访问器包装你的变量,所以为什么不做相反的事情:

valueAccessor.toString().match(/{return (\w+) }/)[1]

我不是 regEx 专家,但这适用于我的简单 demo

【讨论】:

  • 我喜欢这种方法!我从另一个问题中得到的答案在自定义绑定之外的视图模型中工作正常。但如果你在自定义绑定中,Ilya 的方法会感觉更好。
  • @sifriday,谢谢伙计!我认为 TO 在自定义活页夹中需要这个,因为他在原始问题中使用了一个。
【解决方案2】:

目前还有一个非常相似的问题也很活跃:

Knockout how to get data-bind keys and value observables using element?

我有一个想法,并给出了答案,但我找不到一个完美的方法来做到这一点。我认为 KO 已将 'valueOnModel' 解析为各种函数引用,它实际上并没有让您访问它最初从绑定中解析出来的字符串。

所以我想,也许你可以通过重新解析元素的绑定来实现你所需要的?

    var binding_info = {};
    $($(element).attr("data-bind").split(",")).each(
        function(idx, binding) {
            var parts = binding.split(":")
            binding_info[parts[0].trim()] = parts[1].trim()
        }
    )

然后,一旦你这样做了,

    binding_info.value

应该返回“valueOnModel”

在另一个 Q 中有一个关于使用的好主意:

http://joel.net/unobtrusive-data-binding-for-knockout-js

预先将绑定定义为 JS 对象。然后你就可以在你的绑定处理程序中使用这个对象作为查找。

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2020-10-05
    • 1970-01-01
    • 2023-03-07
    • 2017-12-05
    相关资源
    最近更新 更多