KnockoutJs& Asp.Net MVC 4 - 更改视图模型取决于所选类型

时间:2012-12-10 17:23:33

标签: asp.net-mvc knockout.js knockout-mvc

我正在使用MVC 4和KnockoutJs,我遇到了这种情况

我有一个对象(称为父对象),它有一个名为ChildType

的属性

_如果ChildType = 1 --->我将使用ViewModel-A渲染Partial-A _如果ChildType = 2 --->我将使用ViewModel-B

渲染Partial-B

我发现没有太多关于我的问题的文章或答案。最重要的是,他们建议使用一个主ViewModel,不知何故它是最好的方式,但如果我们有超过2个子视图模型,则意味着主视图模型如此之大。

所以,请帮我实现它。

此致..

2 个答案:

答案 0 :(得分:0)

使用模板绑定

<!-- ko template: { name: childTemplate, data: childModel } -->
<!-- /ko -->

childTemplate是一个可观察的,可以是计算的,也可以是标准的observable,它将返回一个字符串,其中包含要呈现的模板的名称。 childModel一个observable或computed,它将返回所选的childModel

此外,如果childModel可以为null,则需要在模板绑定中添加if检查,否则会出现空错误

<!-- ko template: { name: childTemplate, data: childModel, if: childModel } -->
<!-- /ko -->

答案 1 :(得分:0)

使用模板绑定:

 <!-- ko template: { name: templateName, data: modelName, if: modelName } -->
 <!-- /ko -->

然后,在视图模型中添加以下observable: templateName和modelName。

您的视图模型可能如下所示:

var parent = {
    ChildType: ko.observable(1),
    templateName: ko.observable('Partial-A'),
    modelName: ko.observable(ViewModelA)
};

接下来要做的是根据ChildType值设置templateName和modelName。

var option = parent.ChildType();

if(option == 1)
{
      parent.modelName(null);
      parent.templateName('Partial-A');
      parent.modelName(ViewModelA);
 }

在更改模板名称之前将modelName设置为null非常重要,因为ko将无法应用绑定。

接下来,您只需定义模板,如下所示:

<script id="Partial-A" type="text/html">  
 // your code goes here
</script>