2011-07-18 42 views

回答

1

命名空间插件可能是最好的解决方案,如果你需要有多个混合的视图模型。

虽然典型的答案是将主视图模型与子视图模型关联并绑定到主视图模型。如:

var viewModel = { 
    body: { 
     click: function() { alert("body"); } 
    }, 
    div: { 
     click: function() { alert("body"); } 
    } 
}; 

ko.applyBindings(viewModel); 

现在,您必须将点击次数绑定到body.click和div.click。

一个典型的模式是做这样的事情:

var viewModel = { 
    body: ko.observable(), 
    div: ko.observable() 
}; 

现在,你可以使用模板绑定,这将不会呈现任何东西,如果观察的是零,并允许您直接指定click代替div.click,因为您将视图模型作为模板绑定的参数data。然后,如果/当子视图模型被填充(可能通过AJAX),UI将更新。绑定会是这样的:

<div data-bind="template: { name: 'main', data: body, templateOptions: { div: div } }"></div> 

<script id="main" type="text/html"> 
    <button data-bind="click: click">body</button> 
    <div id="a" data-bind="template: { name: 'div', data: $item.div }"></div> 
</script> 

<script id="div" type="text/html"> 
    <button data-bind="click: click">div</button> 
</script> 

的“格”视图模型传递到使用templateOptions表明你不会需要依靠其全球范围内的ViewModel嵌套模板(不需要访问视图模型。 div嵌套模板内)。

样品在这里:http://jsfiddle.net/rniemeyer/7ZsGK/

+0

好,谢谢,我将使用命名空间插件,否则我需要建立一个整体的VM对象 – Sxd

+0

肯定。我主要试图表明,您可以将viewModel作为其他视图模型的容器使用,并且可以根据需要通过模板绑定来来回移动。名称空间插件是一个不错的选择。 –

+0

@Sxd,例如:'{a:ko.observable(new vmA()),b:ko.observable(new vmB())}'那么你可以在其他地方定义vmA和vmB - 而不是我称之为'monolithic' – Tom