我有一个 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
每个复选框添加一个类并在rebind
viewModel 上的函数中执行以下操作来实现这一点,viewModel 在self
哪里:
$("#cart .cart-selection").each(function(index, item) {
ko.applyBindings(self, item);
});
然后在重新加载内容时在自定义触发器上执行以下操作以刷新网格。
$("#cartGrid").on("refresh.ctb.grid", function() {
viewModel.rebind();
});
我目前发现的问题是,无论绑定如何,复选框都不再启用$element.checked
。也许 valueHasMutated 会解决这个问题,但仍在研究这个问题。