【发布时间】:2012-10-13 20:24:46
【问题描述】:
这是我的场景。
我想创建一个单独的 KnockoutJS 绑定提供程序来处理我的页面上的翻译,它将读取页面加载时出现或页面加载后创建的任何元素的 data-alias 属性(可能在渲染的子模板中创建通过敲除)并检索别名的翻译并将它们应用为元素的文本。我仍然希望能够独立调用ko.applyBindings(model, element); 来处理页面的data-bind 属性,但我想单独调用ko.applyBindings,以便可以将翻译应用于data-alias 属性。有谁知道我如何支持两者并让他们独立行事?
这是一个流程应该如何进行的示例。
HTML 标记/模板:
<fieldset>
<legend data-alias="SomeTitle"></legend>
<div class="row-container">
<div class="control-group">
<label class="control-label" data-alias="LabelAlias"></label>
<div class="controls">
<input type="text" data-bind="value: SomeObservable" />
</div>
</div>
<div class="control-group">
<label class="control-label" data-alias="AnotherLabelAlias"></label>
<div class="controls">
<input type="text" data-bind="value: AnotherObservable" />
</div>
</div>
</div>
</fieldset>
在页面加载时,将调用通过绑定提供程序为数据别名应用绑定:
<script type="text/javascript">
$(function() {
// Lets assume translations is a dictionary of alias to translation
// that is loaded with the page synchronously
ko.applyBindings(translations);
});
</script>
同样在页面加载时,会有一个服务调用来检索页面所需的数据,并在检索时将绑定应用于数据:
<script type="text/javascript">
$(function() {
$.ajax({...}) // Omitted for brevity
.done(function(data) {
var viewModel = new my.namespace.SomeViewModel(data);
ko.applyBindings(viewModel);
});
});
</script>
预期效果:
- 页面加载完毕。
- 已应用翻译。
- 启动服务调用以检索数据。
- 服务调用返回。
- 将数据转换为视图模型并绑定到页面(并保留翻译)。
【问题讨论】:
-
对于当前的 KO 实例,您一次只能激活一个绑定提供程序。一种想法是创建一个绑定提供程序,它封装了真正的绑定提供程序,但公开了一个“模式”来确定要查找的内容。然后,您可以在进行翻译绑定时设置此模式。
-
是的,这可能行得通。有机会我会调查的。
-
所以你的第一个页面加载调用获取翻译绑定,然后第二个调用获取这些绑定的结果来获取翻译?
-
第二次调用独立于第一次调用。我只希望第一个调用与页面同步,第二个调用是异步的。
-
您不能将这些合并到一个视图模型中吗?并且在应用翻译时,只需使用一些空数据初始化
viewModel(调用my.namespace.SomeViewModel)。然后用您的 ajax 调用填充这个空白部分。无需多次致电ko.applyBindings