The 淘汰赛网站 http://knockoutjs.com/documentation/custom-bindings.html告诉我们如何从特定元素的自定义绑定内部访问该元素的所有绑定。
不过,我想获取应用特定命名绑定的所有元素的列表。这可以通过淘汰赛的方法实现吗?
例如,我想向 knockout 请求我的页面上使用可见绑定的所有元素的列表。
有趣的问题!
我要出去告诉你你需要做DOM遍历 https://stackoverflow.com/q/4256339/419956你自己。没有任何 Knockout 实用程序可以完全满足您的要求。即便如此,你也必须深入KO。这是基于一些经验以及仔细观察KO TypeScript 定义 https://github.com/borisyankov/DefinitelyTyped/blob/1.3.0/knockout/knockout.d.ts(这可能是 KO 导出功能的近乎完整的概述)。
看着相关位 https://github.com/borisyankov/DefinitelyTyped/blob/1.3.0/knockout/knockout.d.ts#L554在定义中,您可以利用KnockoutBindingProvider
像这样:
var vm = {
submodel: {
name: ko.observable('apple'),
description: ko.observable('fruit')
},
elementsWithTextBindings: ko.observable('')
};
vm.refresh = function() {
var result = "";
var all = document.getElementsByTagName("*");
for (var i=0, max=all.length; i < max; i++) {
var ctx = ko.contextFor(all[i]);
if (ko.bindingProvider['instance'].nodeHasBindings(all[i])
&& !!ko.bindingProvider['instance'].getBindings(all[i], ctx).text) {
var bindings = ko.bindingProvider['instance'].getBindingsString(all[i], ctx);
result += "Elem with id=" + all[i].id + " has `text` binding ('" + bindings + "').\n";
}
}
vm.elementsWithTextBindings(result);
};
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div id="a" data-bind="with: submodel">
<p id="b" data-bind="text: name, style: { color: 'red' }"></p>
<p id="c" data-bind="text: description"></p>
<input id="d" data-bind="value: name" />
</div>
All elements with `text` bindings:
<button id="e" data-bind="click: refresh">refresh!</button>
<pre id="f" data-bind="text: elementsWithTextBindings"></pre>
这利用了您可以到达的事实ko.bindingProvider
从外部。这似乎是按设计 https://github.com/knockout/knockout/blob/v3.2.0/src/binding/bindingProvider.js#L73,因为源将其导出为:
ko.exportSymbol('bindingProvider', ko.bindingProvider);
在我的代码中我还利用nodeHasBindings
, and getBindings
, and getBindingsString
。后者有一条评论 https://github.com/knockout/knockout/blob/v3.2.0/src/binding/bindingProvider.js#L32:
// The following function is only used internally by this default provider.
// It's not part of the interface definition for a general binding provider.
所以我假设前两种方法are公共接口的一部分,因此可以安全地用于您的目的。这getBindingsString
无论如何,对于您的目的来说并不是真正必要的,但我只是为了示例而将其包含在示例中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)