简体   繁体   English

使用knockout.js 渲染局部视图

[英]Render partial view using knockout.js

I have a requirement to load tabs based on user selection in Asp.Net MVC4.我需要根据用户在 Asp.Net MVC4 中的选择加载选项卡。 Each tab element pertains to a partial view.每个选项卡元素都属于一个局部视图。 Each partial view has its own knockout.js bindings.每个局部视图都有自己的 Knockout.js 绑定。

On click of each tab, partial view needs to be rendered below the previously selected tab.单击每个选项卡时,需要在先前选择的选项卡下方呈现部分视图。

Here is a code snippet这是一个代码片段

<div class="row-fluid top-pad-double" id="tabBasedGrowthDiv">
  <ul class="nav nav-pills">
     <li><a href="#tabCustomerInfo" data-toggle="tab" data-bind="click:$root.AddTab">CustomerInfo</a></li>
     <li><a href="#tabPropertyInfo" data-toggle="tab" data-bind="click: $root.AddTab">PropertyInfo</a></li>
     <li><a href="#tabPropertyInfo1" data-toggle="tab" data-bind="click: $root.AddTab">PropertyInfo1</a></li>   
</ul>
<div class="tab-content pills pill-sections">
    <div data-bind="template: { name: 'tabBasedGrowthTemplate', foreach: $root.tabs}"></div>
    </div>
</div>

Knockout.js Html Template Knockout.js Html 模板

<script type="text/html" id="tabBasedGrowthTemplate">
    <div class="tab-pane" >
        <div class="pill-header clearfix">
            <h3>Some title</h3>
                <div class="pull-right">
                    <a href="#" class="btn btn-mini" data-toggle="button" rel="tooltip" data-title="lock this section here" data-placement="top"><i class="icon-lock"></i></a>
                    <a href="#" class="btn btn-mini" rel="tooltip" data-title="close this section" data-placement="left"><i class="icon-remove"></i></a>
                </div>
        </div>
        <div class="pill-content" data-bind="attr:{id: $data.id}">

            @Html.Partial("tab based partial view name")

        </div>
    </div>
</script>

This is the approximate implementation of the view model.这是视图模型的近似实现。

function TabBasedGrowthViewModel() {
        var self = this;

        self.tabs = ko.observableArray([TabViewModel]);
        self.AddTab = function (){}
}

Knockout bindings淘汰赛绑定

<script type="text/javascript">
    $(document).ready(function () {
        ko.applyBindings(new TabBasedGrowthViewModel(), $("#tabBasedGrowthDiv").get(0));
        });
</script>

When I do the above steps I am having a conflict with knockout bindings of the main view model where the partial view is rendered, as it has its own knockout bindings.当我执行上述步骤时,我与呈现局部视图的主视图模型的淘汰赛绑定发生冲突,因为它有自己的淘汰赛绑定。 I am getting this conflicts only if I render the partial view using the knockout template as shown in above Knockout.js Html Template sub-heading.仅当我使用Knockout.js Html Template子标题中所示的knockout模板呈现部分视图时,我才会遇到此冲突。

Any help would be highly appreciated.任何帮助将不胜感激。

Thanks in advance, Alphacoder提前致谢,Alphacoder

I've done something similar by having a NavigationViewModel that is bound to the page and knows what view you want to show and stores that in an observable variable.我做了类似的事情,将 NavigationViewModel 绑定到页面并知道要显示什么视图并将其存储在可观察变量中。 Then around each tab, you use the visible test to see whether it should be shown based on that variable.然后在每个选项卡周围,使用可见测试来查看是否应根据该变量显示它。

You then want to set the page up to allow you to bind different view models to different partial views, and you set this up using:然后你想设置页面以允许你将不同的视图模型绑定到不同的局部视图,你可以使用以下方法进行设置:

// This lets us stop the view model from binding to areas of the page,
// allowing us to bind different objects to parts of the page
ko.bindingHandlers.stopBinding = {
    init: function ()
    {
        return { controlsDescendantBindings: true };
    }
};

ko.virtualElements.allowedBindings.stopBinding = true;
ko.applyBindings(navigationViewModel);

Then in your partial view, you use this code to stop the navigation view model from being bound to it:然后在你的局部视图中,你使用这个代码来阻止导航视图模型被绑定到它:

    <section data-bind="visible: SelectedView() == 'location'">
        <!-- ko stopBinding: true -->        
        <div id="map"></div>
        <!-- /ko -->
    </section>

And bind your other model to this section using:并使用以下命令将您的其他模型绑定到此部分:

        ko.applyBindings(mapViewModel, $('#map')[0]);

Granted, I haven't done this with a template, but that works when using plain html and js with knockout.当然,我没有使用模板完成此操作,但是在使用带有淘汰赛的纯 html 和 js 时有效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM