knockout.js可以从脚本访问绑定上下文吗?



我有一个javascript对象图、一个HTML表单和连接两者的knockout绑定。表单是复杂的,有时表单需要添加一些计算的可观察对象到我们的对象图中的一些子对象,我想在本地做的HTML元素的数据绑定依赖于此,我不希望这样的知识在一些全局脚本的某处。

<div class="widget" data-bind="foreach: subThing">
<script type="text/javascript">
$data._scratchpad = ko.computedObservable( ... );
</script>
...
<input data-bind="value: _scratchpad"/>
...
</div>

现在在这个脚本的上下文中,绑定上下文当然还没有设置,所以$data属性还不可用。

但是,是否有一些事件,我可以把元素或其他东西,所以我可以捕捉绑定时首次初始化,所以我可以添加必要的东西之前,实际的数据绑定表达式要引用它们?

我想出了一个解决方案,只是有点难看,但实际上是正确的。与上面的脚本元素不同,我只使用了一个不包含任何内容的虚元素,它的唯一作用是求值if:条件,然后将语句放入求值的函数体中:

<div class="widget" data-bind="foreach: subThing">
<!-- ko if: (function() { if(!$data._scratchpad) {
$data._scratchpad = ko.computedObservable( ... );
}})() --> <!-- /ko -->
...
<input data-bind="value: _scratchpad"/>
...
</div>

的好处是不需要修改源代码。虽然使用锅炉板代码看起来有点难看:

<!-- ko if: (function() { if(!...) {
...
}})() --> <!-- /ko -->

我可以使用自定义绑定的预处理器来封装这个函数,而不是简单地说:

<!-- ko setup: 
...
--> <!-- /ko -->

这几乎是整洁的,但真的没有好到值得这样做。

这个虚元素定义已经在注释中了,这有点方便,所以使用特殊字符的javascript代码不会有任何问题。