1

我有一个 AJAX MVC Contrib Grid 实现,它已经存在,现在我正处于尝试使用一些淘汰功能的情况......我想知道在不改变整个网格实现的情况下这是否可能。

这是在分页更改时设置容器 html 的刷新网格功能。

scope.refreshGrid = function (container, url) {
    if (url)
        container.data(scope.selectors.actionUrlAttribute, url);
    $.post((url || container.data(scope.selectors.actionUrlAttribute)), scope.getParams(),
        function(html) {
            container.html($(html).html());
            scope.bindDeleteButtons();
        }).done(function() {
            container.trigger("refresh.ctb.grid");
        });
}

网格的列之一是自定义列,使用Html.Partial如下:

column.Custom(x => Html.Partial("_CartSelection", new CartSelection(x.Id))); 

部分视图具有以下标记和一些淘汰数据绑定

<input type="checkbox" value="@Model.Id" data-bind="enable: (selectionEnabled() || $element.checked), checked: selectionIds" />

This works for the first page of results, when the paging is selected to change the page and the container html() is updated the bindings no longer work but the KO viewModel still has the correct selectionIds.. which is what I was expecting to happen.

KO 视图模型的应用如下所示,其中网格有一个div带有id“购物车”的包装父级:

    $(function() {
        var viewModel = new IP.Configuration.CartSelector(new IP.Router());
        ko.applyBindings(viewModel, document.getElementById("cart"));
    });

我已经在其他帖子中看到了关于您不应该如何重新应用绑定的评论。在我的情况下,我似乎想应用绑定,但仅限于一些动态加载的子节点。

这可能吗?

更新: 几乎可以通过向cart-selection每个复选框添加一个类并在rebindviewModel 上的函数中执行以下操作来实现这一点,viewModel 在self哪里:

        $("#cart .cart-selection").each(function(index, item) {
            ko.applyBindings(self, item);
        });

然后在重新加载内容时在自定义触发器上执行以下操作以刷新网格。

        $("#cartGrid").on("refresh.ctb.grid", function() {
            viewModel.rebind();
        });

我目前发现的问题是,无论绑定如何,复选框都不再启用$element.checked。也许 valueHasMutated 会解决这个问题,但仍在研究这个问题。

4

1 回答 1

0

我弄清楚我剩下的问题是什么,这是由于数据绑定的顺序。

enable数据绑定需要放在绑定之后,因为checked它依赖于它$element.checked,现在实现它之后就有意义了!!

我将重新绑定功能稍微更改为以下内容:

var gridResult = $("#cartGrid table");
if (gridResult.length > 0)
    ko.applyBindings(this, gridResult[0]);

每次刷新都会带来一个新表,但至少现在如果我向网格结果中的其他元素添加更多绑定,它们将按预期工作。

于 2014-07-21T13:44:22.213 回答