做这种事情的一种流行方式是拥有一个主视图模型来托管子视图模型。
下面是定义具有模板和关联数据的“模型”对象的一个非常基本的示例。
function Model(key, template, data) {
this.key = key;
this.template = ko.observable(template);
this.data = data;
}
var viewModel = {
models: ko.observableArray([
new Model("user", "userTmpl", { first: "Bob", last: "Smith" }),
new Model("item", "itemTmpl", { name: "MyItem", description: "Here are some details" })
]),
selectedModel: ko.observable()
};
ko.applyBindings(viewModel);
然后,你可以使用它像:
<select data-bind="options: models, optionsText: 'key', optionsCaption: 'select a model...', value: selectedModel"></select>
<hr />
<div data-bind="with: selectedModel">
<div data-bind="template: { name: template(), data: data }"></div>
</div>
<script id="userTmpl" type="text/html">
<span data-bind="text: last"></span>, <span data-bind="text: first"></span>
</script>
<script id="itemTmpl" type="text/html">
<h3 data-bind="text: name"></h3>
<div data-bind="text: description"></div>
</script>
http://jsfiddle.net/rniemeyer/29kWf/
很显然,你不可能绑定在选择模型的选择,但它有助于展示如何能行得通。而不是数组,模型可能是属性名称与密钥匹配的对象。
“模型”对象中的“数据”将是您的子视图模型。
谢谢瑞恩,我想我已经开始更清楚地看到KO了。使用这种方法加上KO Mapping插件将数据(第一,最后,名称,描述等)绑定为可观察数据是否正确?在我的scenerio中,我通过ajax提取数据。事实上,如果我最终通过ajax同时提取模板和数据,我应该可以在Success回调中调用'applyBindings'来将所有东西都钩住 - 正确吗?当我有一些时间空闲时,我会在周末放弃这一点。 – jimlyndon
用这个想法使用映射插件绝对没问题。在成功回调中调用applyBindings是很好的。除非传递第二个参数以将其限制为某个元素,并且仅针对非子元素的多个元素进行多次调用,否则您只需要一次调用它。 否则,在我提供的示例中,您可以先调用applyBindings,直到selectedModel被填充,否则实际上没有任何绑定。 –