0

我正在尝试实现主从网页,左侧是一个控件,您可以在该控件上选择一个元素。右侧显示了所选元素的详细信息。我正在使用 asp.net mvc,并且我已经实现了下载(使用 ajax)元素详细信息的主控制。

编辑
感谢 photo_tom 的回复和我的进一步研究,我设法重新加载子视图模型和详细信息子页面。不幸的是它不起作用:(如果我做类似的事情工作正常。但如果我只尝试动态放置内部html并随后更改视图模型,它会失败。如何使绑定与动态替换元素的innerHtml一起工作?

@{
    ViewBag.Title = "Products";
}

<h2>Products</h2>

<div class="ms-master">
    <select size="15" data-bind="
        options: Products,
        optionsText: 'Name',
        value: CurrentProduct
        ">
    </select>
</div>

<div class="ms-slave" data-bind="
    with: CurrentProductVM">
  <div data-bind="html: $parent.CurrentProductHtml" />
</div>

<script type="text/javascript" language="javascript">
    function Product(data) {
        var self = this;
        ko.mapping.fromJS(data, {}, this);
    };

    function ViewModel(data) {
        var self = this;
        if (data != undefined) {
            ko.mapping.fromJS(data, {
                'Products': {
                    'create': function(d) {
                        return new Product(d.data);
                    }
                }
            }, this);
        }

        self.CurrentProductHtml = ko.observable();
        self.CurrentProductVM = ko.observable();
        self.CurrentProduct = ko.observable();
        self.OnCurrentProduct = function(value) {
            $.getJSON(
                self.DetailsUrl(),
                { id: value.Id() },
                function (result) {
                    self.CurrentProductVM(result.Model);
                    self.CurrentProductHtml(result.View);
                }
            );
        };
        self.CurrentProduct.subscribe(self.OnCurrentProduct);
    };

    $(function () {
        var model = @Html.Raw(Json.Encode(Model.Data));
        var vm = new ViewModel(model);
        ko.applyBindings(vm);
    });
</script>

旧帖子

控制器上的Details操作返回 PartialView,我希望在其上拥有一个单独的 KO 视图模型来控制局部视图。怎么做?也许我的问题有更好的解决方案?

这是类似的问题,但使用此解决方案我必须查询控制器两次:一次获取 VM,第二次获取视图,不是吗?

JS

function Product(data) {
    var self = this;
    ko.mapping.fromJS(data, {}, this);

    self.AsyncDetails = ko.observable();
    self.OnSelect = function() {
        $.get(
            '@Url.Action("Details", "ProductsMgm")',
            { id: self.Id() },
            function (e) {
                self.AsyncDetails(e);
            }
        );
    };
};

function ViewModel(data) {
    var self = this;
    if (data != undefined) {
        ko.mapping.fromJS(data, {
            'Products': {
                'create': function(d) {
                    return new Product(d.data);
                }
            }
        }, this);
    }

    self.CurrentProduct = ko.observable();
    self.OnCurrentProduct = function(value) {
        value.OnSelect();
    };
    self.CurrentProduct.subscribe(self.OnCurrentProduct);
};

** HTML **

<div class="ms-master">
    <select size="15" data-bind="
        options: Products,
        optionsText: 'Name',
        value: CurrentProduct
        ">
    </select>
</div>

<div class="ms-slave" data-bind="
    with: CurrentProduct">
    <div data-bind="html: AsyncDetails" ></div>
</div>
4

1 回答 1

0

我已经在同一页面上使用列表和编辑视图完成了此操作。一般来说,如果编辑详细信息,请执行以下操作。

  1. 在初始 ajax 调用中检索屏幕两侧的所有数据。
  2. 当用户单击“编辑”按钮(例如)时,将右侧对象传递给“编辑”功能。
  3. “编辑”功能如下:

    • 制作传递给它的 Edit 对象的深层副本。这可以防止任何编辑立即反映在原始对象中。
    • 将新的 Edit 对象的内容复制到右侧的 observables。
    • 当用户完成并更改数据后,通过 ajax 将更新的数据发送到服务器,然后更新原始 Edit 对象的内容

编辑-回应第一条评论首先阅读https://stackoverflow.com/a/10590386/136717关于如何通过ajax检索部分视图。

基本过程将是 - 1. 当您呈现左侧时,在单击以检索数据的控件上,添加一个 Click 绑定。查看http://knockoutjs.com/documentation/click-binding.html了解完整详情。2.您当前的数据项将作为参数传递。在您的“点击”功能中,构建一个 url 来检索您的局部视图。3. 调用将执行 ajax 调用的新库函数,然后将 html 加载到您想要的区域。

于 2012-12-24T14:06:38.087 回答