使用knockout.js渲染局部视图

h6my8fg2  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(180)

我有一个要求,根据用户在Asp.NetMVC4中的选择加载选项卡。每个选项卡元素都属于一个局部视图。每个局部视图都有自己的knockout.js绑定。
单击每个选项卡时,需要在之前选择的选项卡下方呈现部分视图。
下面是一个代码片段

<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模板

<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>

这是视图模型的近似实现。

function TabBasedGrowthViewModel() {
        var self = this;

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

敲除绑定

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

当我执行上述步骤时,我与渲染局部视图的主视图模型的挖空绑定有冲突,因为它有自己的挖空绑定。只有当我使用knockout模板渲染局部视图时,我才会遇到这种冲突,如上面的**Knockout.js Html Template**副标题所示。
任何帮助都将不胜感激。
提前谢谢你,Alphacoder

pieyvz9o

pieyvz9o1#

我已经做了一些类似的事情,通过将NavigationViewModel绑定到页面,它知道您想要显示什么视图,并将其存储在一个可观察的变量中。然后在每个选项卡周围,您使用visible test来查看是否应该根据该变量显示它。
然后,您希望设置该页面以允许您将不同的视图模型绑定到不同的局部视图,您可以使用以下命令进行设置:

// 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);

然后在局部视图中,使用以下代码阻止导航视图模型绑定到它:

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

并使用以下方法将其他模型绑定到此节:

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

当然,我还没有用模板做过这个,但是当使用普通的html和js与knockout时,它就可以工作了。

相关问题